互联网上有两种关于Interface
的陈述,即
声明A
接口不是继承链。
其他声明B
这两个是矛盾的陈述。
请告诉我哪一个是对的?
答案 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 { ... }