Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新实现另一个接口已继承的接口_C#_.net_Interface_Language Design - Fatal编程技术网

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

C# 重新实现另一个接口已继承的接口,c#,.net,interface,language-design,C#,.net,Interface,Language Design,我经常看到这样的东西: interface A { ... } interface B : A { ... } class C : B, A { ...} 为什么要指定C实现接口A,而B已经继承了A? 它有语义上的区别吗?还是只是风格的问题 (许多示例之一是List实现IList和ICollection,而IList也源于ICollection) 更新:感谢您确认我的猜测,它没有任何语义差异 我提出了一种相关的情况,在这种情况下,显式命名已存在于继承树中的接口确实会有所不同: 如果B是一个类

我经常看到这样的东西:

interface A { ... }
interface B : A { ... }
class C : B, A { ...}
为什么要指定C实现接口A,而B已经继承了A? 它有语义上的区别吗?还是只是风格的问题

(许多示例之一是
List
实现
IList
ICollection
,而
IList
也源于
ICollection


更新:感谢您确认我的猜测,它没有任何语义差异

我提出了一种相关的情况,在这种情况下,显式命名已存在于继承树中的接口确实会有所不同:

如果
B
是一个类,
C
只会(重新)实现
a
中的接口成员,如果它在“
后面显式地命名
a


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

我认为这只是风格问题。在查看框架/库类时,这一点特别重要——例如,在您的示例中,它强调了这样一个想法,即该类可以被视为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() {}
    }
}

我认为这是为了更好的可读性。。不必让你的脑细胞穿过界面继承层次结构。