programing

인터페이스에서 생성자를 지정할 수 없는 이유는 무엇입니까?

instargram 2023. 5. 22. 20:18
반응형

인터페이스에서 생성자를 지정할 수 없는 이유는 무엇입니까?

중복 가능성:
생성자 서명을 정의하는 인터페이스?

의 인터페이스에서 생성자를 지정할 수 없습니다.네트, 근데 왜 안 돼요?

현재 프로젝트에서 '엔진'이 생성자와 함께 전달되어야 한다고 지정할 수 있다면 매우 유용할 것입니다. 하지만 할 수 없기 때문에 클래스에 대한 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

반응형