当基类已经扩展了相同的接口时是否扩展接口

时间:2018-12-22 16:07:13

标签: c# inheritance interface base-class interface-implementation

在C#中,如下面的代码片段所示,在知道类A且知道类BaseClass扩展了接口IFoo时,扩展接口IFoo是否正确/合适?是否需要在此处指定接口IFoo?这是最佳做法吗?

class A : BaseClass, IFoo
{
}

可能是一个愚蠢的问题,但是在这种情况下合适的做法是什么?

2 个答案:

答案 0 :(得分:5)

如果BaseClass是从IFoo继承的,则完全没有必要在类A中使用IFoo。

检查下面的图像(建议使用Resharper

enter image description here


特别感谢@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

答案 1 :(得分: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)有用吗?

另外,另一个要点是,MSDN中的信息如何可能会产生误导,似乎暗示着在许多类中没有任何明显理由就重新声明了许多接口;例如,许多集合类型都重新声明了无限数量的接口。

确实不是这样,问题在于文档是基于程序集的元数据构建的,并且该工具无法真正识别接口是否直接以类型声明。另外,因为即使文档在源代码中并非100%准确,它的文档(明确地告诉您所实现的接口,无论它们实际在何处声明)也可以带来好处。