문제

나는 이런 것들을 많이 본다 :

interface A { ... }
interface B : A { ... }
class C : B, A { ...}

B가 이미 상속 될 때 C가 인터페이스 A를 구현하도록 지정하는 이유는 무엇입니까? 의미 론적 차이를 만들거나 스타일의 문제입니까?

(많은 예 중 하나는입니다 List<T> 구현 IList<T> 그리고 ICollection<T>, 동안 IList<T> 또한 파생됩니다 ICollection<T>).


업데이트: 의미 론적 차이를 만들지 않는다는 추측을 확인해 주셔서 감사합니다.

나는 그것이 어디에서 관련 상황을 생각해 냈다. 하다 상속 트리에 이미있는 인터페이스를 명시 적으로 이름을 지정하기 위해 차이를 만듭니다.

만약에 B 수업이었고 C 인터페이스 멤버 만 구현합니다 A 이름이 있다면 A 명시 적으로 ':'.

편집] 명시 적으로 구현 된 인터페이스 멤버와의 혼란을 피하기 위해 질문의 문구를 변경하여 객체가 인터페이스로 캐스팅되는 경우 멤버의 사용을 제한합니다.

도움이 되었습니까?

해결책

나는 이것이 단지 스타일의 문제라고 생각합니다. 예를 들어, 프레임 워크/라이브러리 클래스를 볼 때 특히 중요합니다. 예를 들어, 개발자가 실제로 ILIST가 실제로 ICollection이라는 것을 알지 못하고이 클래스를 iCollection 또는 ILIST로 취급 할 수 있다는 아이디어를 강조합니다.

기능적 파급 효과가 없습니다. 구체적으로,이 코드는 'C'를 명시 적으로 구현하는지 여부를 컴파일 할 것입니다.

namespace DotNetInterfaceTest {
    class Program {
        static void Main(string[] args) {
            A c = new C();
        }
    }

    interface A {
        void foo();
    }

    interface B : A {
        void bar();
    }

    class C : B {
        public void bar() {}
        public void foo() {}
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top