6

我经常看到这样的东西:

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

当 B 已经继承 A 时,为什么要指定 C 实现接口 A?它会产生任何语义差异还是只是风格问题?

(许多示例之一是List<T>实现IList<T>and ICollection<T>,同时IList<T>也派生自ICollection<T>)。


更新:感谢您确认我的猜测,它不会产生任何语义差异。

我想出了一个相关的情况,显式命名已经在继承树中的接口确实会有所不同:

如果B是一个类,则C只会(重新)实现接口成员,A如果它A在“”之后显式命名:

[编辑] 我更改了问题的措辞以避免与显式实现的接口成员混淆,这将成员的使用限制在对象被转换为接口的情况下。

4

1 回答 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() {}
    }
}
于 2008-11-01T18:57:45.250 回答