接口与抽象和继承

Interface vs Abstract and Inheritance

我已经看过接口、抽象classes和继承的用法。看到各有各的用处,还是有点懵

我知道一般一个class只能继承另一个class,虽然有些可能支持多重继承,但是它可以实现多个接口(这可能是使用一个的主要原因界面)。然而,这个 class 也可以被另一个 class 扩展,如果我是正确的话。我还看到抽象 classes 可能比接口更快,并且可以有非静态最终变量。

所以,我仍然不确定什么时候使用哪个更好。也许通过举一些例子可以更好地理解这一点。我不反对使用任何,但我认为有些东西我看不到。进一步的解释也可能有所帮助。提前致谢。

这取决于你自己的风格。

事实上,从抽象 class 继承的 class 必须使用它的所有属性和方法——几乎不可能创建一个干净的架构 多层次的继承。

接口的主要优点是灵活性 - 你可以实现其中的大部分但不必改变 class 的内部结构来实现它们。

在大多数情况下,最好使用接口,但在某些情况下 软件模式,如 compositum 或 strategy 模式。

但最后由您决定 - 您必须选择 您在项目中想要的继承类型。

接口帮助您获得灵活性,抽象 classes 带来更多 与您的架构的凝聚力,因为它们将 class 分组为 相似在一起。 --> 您可以重用抽象 classes 中的代码 它的子classes

如果您想使用与基础 class 相同的代码并使用额外功能对其进行扩展,那么从基础 class 继承很有用。

虚拟和抽象与此有关。您可以使用基本实现创建虚方法。后代 class 可以(可选)更改或添加到此实现。抽象 class 是一个本身不完整的基础 class。声明了一个抽象方法,但还没有实现。后代 class 必须 提供一个实现。如果基础 class 实现了一个流,但该流的一部分需要由另一个 class 实现,这将很有用。基础 class 需要能够调用该部分,这是声明抽象方法的地方。

接口是另一回事。接口是关于 class 中存在哪些方法的契约,但它们可以由两个完全不相关的 class 实现。这很方便,因为您可以为小功能制作小接口。例如,可以保存的东西可以实现ISavable,它只是强制存在方法'Save'。两个完全不同的 classes 可以实现这一点,例如允许“全部保存”功能只保存所有可以保存的内容。

多重继承是一种特定的语言特性,在许多语言中不可用,尽管在许多语言中,您可以通过使用接口和 delegate 设计模式获得类似的效果。

通常,当您想要指定什么 class 应该做什么而不是如何[=21= 时使用接口] 它应该这样做。例如,排序函数可能仅适用于实现某种 Comparable 接口的 class 对象数组,该接口需要它实现比较运算符,但它并不关心这种比较究竟是如何工作的。

另一方面,

摘要 class 将包含一些实际的 代码Comparable abstract class 可能会使用比较运算符实现各种算法,但它还没有准备好实例化,除非你在 subclass.

中实际实现这样的运算符

一个class不能扩展多个superclassess,因为所谓的菱形问题(和类似的东西)。但是,接口不携带任何代码,因此这不是问题,您可以在单个 class.

中实现多个接口