【问题标题】:Re-implementing an interface that another interface already inherits重新实现另一个接口已经继承的接口
【发布时间】:2008-11-01 18:50:06
【问题描述】:

我经常看到这样的东西:

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

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

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


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

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

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

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

【问题讨论】:

    标签: c# .net interface language-design


    【解决方案1】:

    我相信这只是风格问题。在查看框架/库类时,这一点特别重要 - 例如,在您的示例中,它强调了可以将此类视为 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() {}
        }
    }
    

    【讨论】:

    • 我认为这是为了更好的可读性.. 无需让您的脑细胞遍历接口继承层次结构。
    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2019-08-04
    • 2016-09-12
    • 2023-03-13
    • 2022-01-15
    • 1970-01-01
    • 2010-12-13
    • 2020-10-17
    相关资源
    最近更新 更多