接口与抽象和继承
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.
中实现多个接口
我已经看过接口、抽象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.
中实现多个接口