別のインターフェイスが既に継承しているインターフェイスを再実装する

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

質問

このようなものがたくさん見られます:

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

BがすでにAを継承しているのに、CがインターフェイスAを実装するように指定するのはなぜですか? セマンティックな違いはありますか、それともスタイルの問題ですか?

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


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

関連する状況で、既に継承ツリーにあるインターフェイスに明示的に名前を付けるするという違いがあります:

Aがクラスの場合、:は、<=>の後に明示的に<=>という名前を付けた場合にのみ<=>からインターフェイスメンバーを(再)実装します。

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

役に立ちましたか?

解決

これは単なるスタイルの問題だと思います。フレームワーク/ライブラリクラスを見るとき、それは特に重要です-たとえば、あなたの例では、開発者が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() {}
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top