Inheritance 接口与抽象和继承

Inheritance 接口与抽象和继承,inheritance,interface,abstract-class,multiple-inheritance,extends,Inheritance,Interface,Abstract Class,Multiple Inheritance,Extends,我已经研究了接口、抽象类和继承的用法。我知道每一种都有其用途,但我还是有点困惑 我知道,通常一个类只能扩展另一个类,尽管有些类可能支持多重继承,但它可以实现多个接口(这可能是使用接口的主要原因)。然而,如果我是正确的,这个类也可以被另一个类扩展。我还看到抽象类可能比接口更快,并且可以有非静态的最终变量 所以,我仍然不确定什么时候使用哪个更好。也许通过举例可以更好地理解这一点。我不反对使用任何东西,但我认为有些东西我没有看到。进一步的解释也会有所帮助。提前谢谢。这取决于你自己的风格 事实上,从抽象

我已经研究了接口、抽象类和继承的用法。我知道每一种都有其用途,但我还是有点困惑

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


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

这取决于你自己的风格

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

接口的主要优点是灵活性- 您可以实现其中的大部分功能,但不必更改 实现它们的类的内部结构

在大多数情况下,使用接口是最佳实践,但在某些情况下除外 软件模式,如compositum或strategy模式

但最终这是你的决定-你必须选择 您希望在项目中使用的继承类型

接口帮助您获得灵活性,抽象类带来更多 对体系结构的内聚性,因为它们将 相似之处。-->您可以在中重用抽象类的代码
如果您希望使用与基类相同的代码并使用额外的功能对其进行扩展,则继承自基类的子类将非常有用

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

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


多重继承是一种特定的语言功能,在许多语言中不可用,尽管在许多语言中,通过使用接口和委托设计模式可以产生类似的效果。

通常,当您希望指定类的工作方式,而不是指定类的工作方式时,请使用接口。例如,排序函数可能只在类的对象数组上起作用,该类实现了某种类型的
Comparable
接口,该接口要求它实现比较运算符,但它不关心这种比较到底是如何工作的

另一方面,抽象类将包含一些实际代码
Comparable
抽象类可能使用比较运算符实现各种算法,但除非您在子类中实际实现了这样的运算符,否则它还不能被实例化

一个类不能扩展多个超类,因为所谓的菱形问题(以及类似的问题)。然而,接口不携带任何代码,所以这不是问题,您可以在单个类中实现多个接口