重新实现一个已经继承另一个接口的接口

6

我经常看到这样的内容:

interface A { ... }
interface B : A { ... }
class C : B, A { ...}

为什么要指定C实现接口A,当B已经继承了A呢?这是否有语义上的区别,还是只是风格问题?
(许多例子之一是List 实现 IList 和 ICollection ,而 IList 也派生自 ICollection 。)
更新:感谢确认我的猜想,它并没有产生任何语义上的区别。
我想到了一个相关的情况,其中明确命名已经在继承树中的接口会有所不同:
如果B是一个类,则只有在“:”后显式命名A时,C才会重新实现来自A的接口成员。
[编辑]我更改了问题的措辞,以避免与显式实现的接口成员混淆,这限制了将对象强制转换为接口的情况下使用成员的方式。
1个回答

12

我认为这只是风格上的问题。特别是在查看框架/库类时很重要-例如在你的示例中,它强调了这个类可以被视为ICollection或IList,而不需要开发人员知道IList实际上是ICollection。

它没有任何功能影响。具体来说,无论类'C'是否显式实现接口'A',此代码都将编译:

namespace DotNetInterfaceTest {
    class Program {
        static void Main(string[] args) {
            A c = new C();
        }
    }

    interface A {
        void foo();
    }

    interface B : A {
        void bar();
    }

    class C : B {
        public void bar() {}
        public void foo() {}
    }
}

我认为这样做可以提高可读性...而无需费力地遍历接口继承层次结构。 - Gishu

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