26

次のような単純な抽象基本クラスがあるとしましょう

abstract class Item : IDisplayable
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public abstract void Print();

    }

そして、私はそれを継承するクラスを持っています

  class Chair: Item
 {
    public int NumberOfLegs {get;set;}

    public void Print()
    {
     Console.WriteLine("Here is a simple interface implementation");
    }
 }

interface IDisplayable
{
void Print();
}

子クラスは、Interface も実装することを明示的に述べていませんが、単純な継承によって実装します。インターフェイスを子クラスに明示的に追加すると、プログラムは同じように実行されます (少なくとも、私の簡単な例でわかる限り)。インターフェイスを明示的に実装することは良いアイデアですか、それとも悪いアイデアですか?それとも厳密には好みの問題ですか?

4

3 に答える 3

4

はからItem継承するためIDisplayable、 から派生するものはすべてItemも実装する必要がありますIDisplayable。したがってIDisplayable、これらのクラスに明示的に追加することは冗長です。

編集: @EricLippert は、インターフェイスの再実装の効果について、以下で優れた点を指摘しています。コメントでの議論を維持するために、この回答を残しています。

于 2013-06-24T14:49:03.307 に答える
0

「インターフェイスを明示的に実装する」と言うとき、クラス宣言にインターフェイスを含めることを意味していると思います。インターフェイスを明示的に実装することには、別の特定の意味があります。そうは言っても、基本クラスが実装するインターフェイスを派生クラスが実装することを宣言することは正しくありませんが、派生クラスにはそのインターフェイスの実装が含まれていないため、コンパイラはそれを許可します。基本クラスがインターフェイスを明示的に実装した場合に何が起こるかを考えてみましょう -

abstract class Item : IDisplayable
{
    void IDisplayable.Print() { ... }
}

現在、派生クラスは基本クラスのメソッドを認識できず、派生クラスのコンシューマーも認識できません。もちろん、消費者は具体的な派生クラスではなくインターフェイスを使用する必要があり、明示的なインターフェイス メソッドにアクセスできます。ただし、派生クラス自体のスコープ内では、基本クラスが実装するインターフェイスを認識しません。一部のメンバーが抽象、保護、または仮想であることのみ。

于 2013-06-24T15:05:09.640 に答える