6

私はこのようなものをたくさん見ます:

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

B が既に A を継承しているのに、なぜ C がインターフェイス A を実装すると指定するのでしょうか? 意味的な違いはありますか、それとも単にスタイルの問題ですか?

(多くの例の 1 つは と の実装List<T>ですが、からも派生しています)。IList<T>ICollection<T>IList<T>ICollection<T>


更新:セマンティックな違いはないという私の推測を確認していただきありがとうございます。

すでに継承ツリーにあるインターフェイスに明示的に名前を付けることが違いを生む、関連する状況を思いつきました。

Bクラスの場合、' ' の後に明示的に名前が付けられている場合にCのみ、からのインターフェイス メンバーを (再) 実装します。AA:

[編集] オブジェクトがインターフェイスとしてキャストされる場合にメンバーの使用を制限する、明示的に実装されたインターフェイス メンバーとの混乱を避けるために、質問の文言を変更しました。

4

1 に答える 1

12

これは単にスタイルの問題だと思います。フレームワーク/ライブラリクラスを見るときは特に重要です。たとえば、あなたの例では、開発者が IList が実際に ICollection であることを知らなくても、このクラスを ICollection または IList として扱うことができるという考えを強調しています。

機能的な影響はありません。具体的には、クラス 'C' が 'A' を明示的に実装するかどうかにかかわらず、このコードはコンパイルされます。

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() {}
    }
}
于 2008-11-01T18:57:45.250 に答える