이 인터페이스 중 하나가 나머지 부분에서 상속되면 C# (Arraylist와 같은)의 컬렉션 클래스가 여러 인터페이스에서 상속되는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1023375

문제

vs2008에서 생성 된 메타 데이터로 이동하기 위해 ArrayList 키워드에서 F12를 누르면 다음과 같이 생성 된 클래스 선언이 있음을 알았습니다.

public class ArrayList : IList, ICollection, IEnumerable, ICloneable

ILIST는 이미 Icollection에서 상속되고 ienumerable을 상속 받는다는 것을 알고 있습니다. 왜 Arraylist가 이러한 인터페이스에서 중복 상속 되는가?

도움이 되었습니까?

해결책

좋아, 나는 약간의 연구를했다. 다음 계층을 작성하는 경우 :

  public interface One
    {
        void DoIt();
    }

    public interface Two : One
    {
        void DoItMore();
    }

    public class Magic : Two
    { 
        public void DoItMore()
        {
            throw new NotImplementedException();
        }

        public void DoIt()
        {
            throw new NotImplementedException();
        }
    }

컴파일 한 다음 다른 솔루션에서 DLL을 참조하고 Magic을 입력하고 F12를 누르면 다음을 얻을 수 있습니다.

 public class Magic : Two, One
    {
        public Magic();

        public void DoIt();
        public void DoItMore();
    }

인터페이스 계층 구조가 평평 해지거나 컴파일러가 인터페이스를 추가하고 있음을 알 수 있습니까? 반사기를 사용하면 동일한 결과도 얻습니다.

업데이트 : ildasm에서 DLL을 열면 다음을 볼 수 있습니다.

구현 ... 두 개

구현 ... 하나.

다른 팁

추가 인터페이스는 Ilist가 암시하기 때문에 표시됩니다. ILIST를 구현하는 경우 icollection 및 ienumerable도 구현해야합니다.

나는 단지 추측하고 있지만 실제로는 코드의 Ilist만을 구현한다고 생각하지만, 문서는 나머지 인터페이스를 보여주고 클래스를 사용하여 프로그래머에게 명시 적으로 만들기 위해 표시됩니다.

에서 MSDN....

클래스가 동일한 서명을 가진 멤버가 포함 된 두 개의 인터페이스를 구현하면 클래스에서 해당 멤버를 구현하면 두 인터페이스가 해당 멤버를 구현으로 사용하게됩니다.

명시 적 구현은 또한 두 개의 인터페이스가 각각의 속성 및 방법과 같은 동일한 이름의 다른 멤버를 선언하는 경우를 해결하는 데 사용됩니다.

이것을 대답으로 받아들이지 마십시오.

WorkMAD3가 위에서 말한 내용을 반복하고 있습니다.

ArrayList에서 구현함으로써 어떤 인터페이스 ArrayList가 ILIST로 올라가서 ICOLLECTION 및 IENUMERABLE을 구현하는 것을 알기 쉽게 알 수 있습니다.

그것은 상속 체인을 뒤로 켜야 할 필요성을 피합니다.

편집 : 기본 레벨에서 다른 인터페이스를 구현하는 인터페이스는 구현을 제공 할 수 없습니다. (ILIST에서) 파생 된 수업은 간접적으로 iCollection 및 ienumerable을 구현합니다. 따라서 ILIST 구현 자신의 클래스를 작성하더라도 (ICOLLECTION을 추가하지 말고, 선언에 iEenumerable) Icollection & ienumerable에 대한 구현을 제공해야한다는 것을 알 수 있습니다.

WorkMad3의 추론은 의미가 있습니다.

내 생각에 CLR은 다른 인터페이스에서 상속되는 인터페이스를 지원하지 않을 것입니다.

그러나 C#은이 구성을지지하지만 상속 트리를 '평평하게' 'CLR을 준수해야합니다.

편집하다

아래에서 조언을받은 후 vb.net 프로젝트를 신속하게 설정하십시오.

Public Interface IOne
    Sub DoIt()
End Interface

Public Interface ITwo
    Inherits IOne
    Sub DoIt2()
End Interface

Public Class Class1
    Implements ITwo

    Public Sub DoIt() Implements IOne.DoIt
        Throw New NotImplementedException()
    End Sub

    Public Sub DoIt2() Implements ITwo.DoIt2
        Throw New NotImplementedException()
    End Sub
End Class

다음과 같은 결과를 컴파일합니다 (C#) :

public class Class1 : ITwo
{
    public Class1();
    public void DoIt();
    public void DoIt2();
}

이것은 vb.net이하는 것을 보여줍니다 아니다 C#과 달리 인터페이스 계층을 평평하게하십시오. 나는 이것이 왜 그런지에 대한 단서가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top