5

C# では、以下のコード スニペットに示すように、クラス A を宣言するときにインターフェイス IFoo を拡張することは正しい/適切ですか? クラス BaseClass がインターフェイス IFoo を拡張することを知っていますか? ここでインターフェイス IFoo を指定する必要がありますか?それはベスト プラクティスですか?

class A : BaseClass, IFoo
{
}

ばかげた質問かもしれませんが、この場合の適切なプラクティスは何ですか?

4

2 に答える 2

6

BaseClass が IFoo から継承されている場合、クラス A で IFoo を使用する必要はまったくありません。

下の画像を確認してください(この推奨事項にはResharperが使用されています)

ここに画像の説明を入力


@InBetween に感謝します

インターフェースの再実装の場合、子クラスのインターフェースを再定義するユースケースがあります。

interface IFace
{
    void Method1();
}
class Class1 : IFace
{
    void IFace.Method1()
    {
        Console.WriteLine("I am calling you from Class1");
    }
}
class Class2 : Class1, IFace
{
    public void Method1()
    {
        Console.WriteLine("i am calling you from Class2");
    }
}

int main void ()
{
    IFace ins = new Class2();
    ins.Method1();
}

このメソッドは戻りますi am calling you from Class2

一方、

interface IFace
{
    void Method1();
}
class Class1 : IFace
{
    void IFace.Method1()
    {
        Console.WriteLine("I am calling you from Class1");
    }
}
class Class2 : Class1
{
    public void Method1()
    {
        Console.WriteLine("i am calling you from Class2");
    }
}

int main void ()
{
    IFace ins = new Class2();
    ins.Method1();
}

戻り値I am calling you from Class1

于 2018-12-22T16:15:23.770 に答える
2

特定のシナリオでは受け入れられた答えは正しいですが、これは常に当てはまるとは限りません。

クラス宣言でインターフェイスを再宣言することは、インターフェイスを再実装する場合に役立ち、必要になる場合があります。

次のコードを検討し、注意深く調べてください。

interface IFoo {
    string Foo(); }

class A: IFoo {
    public string Foo() { return "A"; } }

class B: A, IFoo {
}

class C: A {  
    new string Foo() { return "C"; } }

class D: A, IFoo {
    string IFoo.Foo() { return "D"; } }

そして、次のコードが何を出力するかを考えてみてください:

IFoo a = new A();
IFoo b = new B();
IFoo c = new C();
IFoo d = new D();

Console.WriteLine(a.Foo());
Console.WriteLine(b.Foo());
Console.WriteLine(c.Foo());
Console.WriteLine(d.Foo());

Dインターフェイス (type ) の再宣言がどのように役立つかわかりましたか?

また、MSDN の情報は誤解を招く可能性があり、多くのクラスで明らかな理由もなく多くのインターフェイスが再宣言されているように見えます。たとえば、多くのコレクション型は、無限の量のインターフェイスを再宣言します。

これは実際には正しくありません。問題は、ドキュメントがアセンブリのメタデータに基づいて構築されており、インターフェイスが型で直接宣言されているかどうかをツールが実際に識別できないことです。また、実際に宣言されている場所に関係なく、実装されたインターフェースを明示的に伝えるそのドキュメントは、ソースコードで100%正確でなくてもボーナスです。

于 2018-12-22T21:39:23.400 に答える