接口是否在继承链中

本文关键字:继承 是否 接口 | 更新日期: 2023-09-27 18:32:30

互联网上关于Interface有两种类型的陈述,即
报表 A

接口不在继承链中。

其他声明B

接口

可以继承其他接口

这两种说法是相互矛盾的。

请告诉我哪一个是对的?

接口是否在继承链中

它们都是真的,有点。

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

base.

你不会看到接口的成员。

语句 B:读作"接口可以实现其他接口"会更好。 你可以有一个实现链;但他们并不是真正的继承。

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

这两种说法都是正确的。

第二种说法是正确的。接口 A:接口 B 非常好,实现接口 A 的类也必须继承接口 B。

"接口不在继承链中"的意思是,如果 DerivedClass : BaseClass, InterfaceA,则可以使用 base 从 DerivedClass 访问 BaseClass 成员。BaseClassMethod,而你不能调用base。InterfaceAMethod 以相同的方式,因为接口不是继承链的一部分。相反,它们的成员可以通过多态性访问。

它们都是正确的,因为它们都可以使用 C#。但当我们为接口而不是实现编写干净的代码和程序时:

  • 我们不想对接口链感到惊讶。
  • 并且,我们遵循接口隔离原则。

考虑一下,

interface IFileRepository : IDisposable { ... }

这就是说,无论谁实现IFileRepository,都必须实现IDisposable。但是,我可以编写一个文件存储库,它可能不需要释放任何资源。或者在单元测试期间的另一个例子,我为一个类编写了一个 FileRepository -Stub,该类将其用作依赖项,但根本不调用Dispose(),至少在我测试的方法中是这样。然而,我必须实施IDisposable.

干净的设计不应该规定这种实现。具体的实现应该知道要提供什么。

class FileRespository : IFileRepository , IDisposable { ... }

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

如果存在命名矛盾,则实现类必须使用显式接口实现。