C# では、以下のコード スニペットに示すように、クラス A を宣言するときにインターフェイス IFoo を拡張することは正しい/適切ですか? クラス BaseClass がインターフェイス IFoo を拡張することを知っていますか? ここでインターフェイス IFoo を指定する必要がありますか?それはベスト プラクティスですか?
class A : BaseClass, IFoo
{
}
ばかげた質問かもしれませんが、この場合の適切なプラクティスは何ですか?
C# では、以下のコード スニペットに示すように、クラス A を宣言するときにインターフェイス IFoo を拡張することは正しい/適切ですか? クラス BaseClass がインターフェイス IFoo を拡張することを知っていますか? ここでインターフェイス IFoo を指定する必要がありますか?それはベスト プラクティスですか?
class A : BaseClass, IFoo
{
}
ばかげた質問かもしれませんが、この場合の適切なプラクティスは何ですか?
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
特定のシナリオでは受け入れられた答えは正しいですが、これは常に当てはまるとは限りません。
クラス宣言でインターフェイスを再宣言することは、インターフェイスを再実装する場合に役立ち、必要になる場合があります。
次のコードを検討し、注意深く調べてください。
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%正確でなくてもボーナスです。