当基类已经扩展相同接口时,是否应该扩展接口?

5
在C#中,如下代码片段所示,当声明类A时扩展接口IFoo是否正确/适当,已知类BaseClass扩展了接口IFoo?在此处指定接口IFoo是否必要,并且这是最佳实践吗?
class A : BaseClass, IFoo
{
}

也许是个愚蠢的问题,但在这种情况下应该采取什么适当的做法呢?

在C#中,没有任何东西可以扩展接口,也没有任何东西可以继承接口。接口只能被实现。 - itsme86
我想要区分指定我想要实现一个接口和实际实现它(它的方法)之间的区别。 - Osama
@itsme86 "没有任何东西继承接口" - 是不正确的。"...接口可以从其他接口继承..." - user585968
2个回答

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();
}

这个方法返回我正在从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();
}

返回我正在从Class1调用您


尽管在OP的问题上下文中100%正确,但一般来说,这个答案并不总是正确的。有一个很少被人知道的语言特性叫做接口重新实现,在这种情况下重新声明接口是必要的。 - InBetween
我刚刚看到你已经回答了你的评论。我也编辑了我的答案,但如果你想的话,我可以撤销我的编辑。 - Derviş Kayımbaşıoğlu
不,没关系,不用担心。 - InBetween

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 上的信息可能会让人误解,似乎在很多类中重新声明了许多接口,而实际上并没有这么多。例如,很多集合类型会重新声明无限数量的接口。

事实上并非如此,问题在于文档是基于程序集的元数据编写的,而工具无法准确判断接口是否直接在类型中声明。此外,因为它是文档,即使它与源代码不完全准确,也明确告诉您已实现了哪些接口,这是一个额外的优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接