인터페이스에서 생성자를 지정할 수 없는 이유는 무엇입니까?
중복 가능성:
생성자 서명을 정의하는 인터페이스?
의 인터페이스에서 생성자를 지정할 수 없습니다.네트, 근데 왜 안 돼요?
현재 프로젝트에서 '엔진'이 생성자와 함께 전달되어야 한다고 지정할 수 있다면 매우 유용할 것입니다. 하지만 할 수 없기 때문에 클래스에 대한 XML 주석으로 충분해야 합니다.
인터페이스가 행동을 설명하기 때문입니다.건설자들은 행동이 아닙니다.객체가 구축되는 방법은 구현 세부사항입니다.
시공자를 어떻게 부르시겠습니까?인터페이스를 사용할 때는 일반적으로 인터페이스의 인스턴스(또는 참조)를 전달합니다.또한 한 클래스가 인터페이스를 구현하는 경우 파생 클래스는 해당 인터페이스를 상속하지만 동일한 생성자 집합을 가지고 있지 않을 수 있습니다.
이제 일반적인 메서드에서 사용할 생성자 및 기타 기본적으로 정적 멤버를 지정하기 위해 정적 인터페이스라고 하는 것을 사용할 수 있습니다.자세한 내용은 아이디어에 대한 블로그 게시물을 참조하십시오.
아니요. 게시된 이유로 인해 인터페이스에 생성자를 둘 수 없습니다.하지만 추상적인 수업은 가능합니다.예를 들어 이 기본 클래스가 있다고 가정합니다.
public abstract class ClassOne
{
protected int _x;
protected string _s;
public ClassOne(int x, string s)
{
_x = x;
_s = s;
}
}
인수를 사용하지 않는 생성자(기본 생성자)는 없습니다. 즉, ClassOne에서 상속되는 클래스는 인수가 2개인 생성자를 호출해야 합니다.
따라서 이것은 유효하지 않으며 컴파일되지 않습니다.
public class ClassTwo : ClassOne
{
public ClassTwo()
{ }
}
그러나 이것은 유효하며 컴파일될 것입니다.
public class ClassTwo : ClassOne
{
public ClassTwo(int x, string s) : base(x, s)
{ }
}
여기서 C#에서는 하나의 기본 클래스에서만 상속할 수 있습니다.이것이 특정 상황에 대한 올바른 해결책이 아닐 수도 있지만 생각해 봐야 한다는 의미입니다.
토니입니다.
이미 게시된 다른 모든 이유 중에서 클래스가 여러 인터페이스를 쉽게 구현할 수 있다는 점도 염두에 두십시오. 그렇다면 어떤 생성자를 사용해야 합니까?
다른 답변에서는 이미 인터페이스에 생성자 선언을 사용하는 것이 말이 되지 않는 이유를 지적했습니다.하지만 당신의 질문으로 볼 때, 저는 당신이 아마도 추상적인 공장 패턴을 찾고 있다고 생각합니다.
당신의 질문에 근거하여 예를 들면, 당신은 어떻게든 '엔진'이 생성자에게 전달되어야 한다고 선언하고 싶다고 말합니다.다음과 같은 구성 서비스에 대한 별도의 인터페이스를 선언하여 이 작업을 수행할 수 있습니다.
public interface IGadgetFactory
{
IGadget CreateGadget(Engine engine);
}
를 IGadget
그런 다음 인스턴스를 사용할 수 있습니다.IGadgetFactory
생성자를 직접 호출하는 대신 인스턴스를 사용합니다.
인터페이스를 인스턴스화할 수 없기 때문에 구성자는 말이 됩니다.
여기에 제공된 다른 설명 외에도, 라인에서 두 개 이상의 구현이 범위 내에 있는 경우 다음과 같이 하기 때문에 어쨌든 호출을 위한 새로운 구문을 고안해야 합니다.
Dim x as new IDoStuff()
어떤 구현이 호출됩니까?
언급URL : https://stackoverflow.com/questions/689474/why-are-we-not-allowed-to-specify-a-constructor-in-an-interface
'programing' 카테고리의 다른 글
안드로이드에서 string.xml의 값을 읽는 방법은 무엇입니까? (0) | 2023.05.22 |
---|---|
Mongo - 속성이 지속되지 않도록 무시합니다. (0) | 2023.05.22 |
재설정 방법 -- 하위 디렉터리 하드 (0) | 2023.05.22 |
트랜잭션 범위를 올바르게 사용하는 방법 (0) | 2023.05.22 |
덱스를 실행할 수 없음: 여러 개의 덱스 파일이 Lcom/myapp/R$ 어레이를 정의합니다. (0) | 2023.05.22 |