接口是否进入继承链?

时间:2012-04-27 12:23:46

标签: c# inheritance interface

互联网上有两种关于Interface的陈述,即
声明A

  

接口不是继承链。

其他声明B

  

Interfaces can inherit other interfaces

这两个是矛盾的陈述。

请告诉我哪一个是对的?

5 个答案:

答案 0 :(得分:5)

接口可以继承其他接口,尝试它,你会发现它有效。

答案 1 :(得分:5)

他们都是真的,有点像。

陈述A:接口不严格继承。如果你有一个实现接口的类,你说

base.

您不会看到界面的成员。

声明B:这将更好地读取"接口可以实现其他接口"。你可以拥有一个实施链;但他们并没有真正继承。

答案 2 :(得分:2)

这两个陈述都是正确的。

第二个陈述是正确的。 InterfaceA:InterfaceB非常好,实现InterfaceA的类也必须继承InterfaceB。

什么是"接口不是继承链"意味着如果DerivedClass:BaseClass,InterfaceA,您可以使用base.BaseClassMethod从DerivedClass访问BaseClass成员,而您不能以相同的方式调用base.InterfaceAMethod,因为接口不是继承链的一部分。相反,他们的成员可以通过多态来访问。

答案 3 :(得分:1)

在.NET世界中,接口绝对可以继承其他接口。然后,任何实现类都应该实现它继承的所有接口的所有方法和属性。

如果存在命名矛盾,则实现类必须使用explicit interface implementations

答案 4 :(得分:1)

它们都是正确的,因为它们都可能与C#一起使用。但, 当我们编写干净的代码和program to an interface instead of an implementation时:

考虑一下,

interface IFileRepository : IDisposable { ... }

这表示,无论谁实现IFileRepository,都必须实现IDisposable。但是,我可以编写一个FileRepository,它可能不需要处理任何资源。或者在单元测试期间我为一个使用它作为依赖项的类编写FileRepository - 存根的另一个例子,但根本不调用Dispose(),至少在我测试的方法。然而,我必须实施IDisposable

清洁设计不应该决定这样的实施。具体实现应该知道要提供什么。

class FileRespository : IFileRepository , IDisposable { ... }