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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否扩展接口,何时基类已经扩展了相同的接口相关的知识,希望对你有一定的参考价值。

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

class A : BaseClass, IFoo
{
}

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

答案

如果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

另一答案

虽然在您的特定情况下接受的答案是正确的,但情况并非总是如此。

在类声明中重新声明接口可能是有用且必要的:当您想重新实现接口时。

请考虑以下代码,仔细研究:

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%准确,也是一个奖励。

以上是关于是否扩展接口,何时基类已经扩展了相同的接口的主要内容,如果未能解决你的问题,请参考以下文章

Java中的接口和抽象类

继承 接口 多态

EJB - 何时使用远程和/或本地接口?

TypeScript - 检查类是不是实现了接口

接口与抽象类 多态

day24 继承 接口 多态