【问题标题】:Interface vs Abstract and Inheritance接口与抽象和继承
【发布时间】:2015-10-16 06:39:00
【问题描述】:
我已经看过接口、抽象类和继承的用法。我看到每个都有它们的用途,但我还是有点困惑。
我知道一般一个类只能扩展另一个类,虽然有些可能支持多重继承,但它可以实现多个接口(这可能是使用接口的主要原因)。但是,如果我是正确的,这个类也可以由另一个类扩展。我还看到抽象类可能比接口更快,并且可以具有非静态最终变量。
所以,我仍然不确定什么时候使用哪个更好。也许通过举一些例子可以更好地理解这一点。我不反对使用任何东西,但我认为有些东西我看不到。进一步的解释也可能有所帮助。提前致谢。
【问题讨论】:
标签:
inheritance
interface
abstract-class
multiple-inheritance
extends
【解决方案1】:
这取决于你自己的风格。
事实上,从抽象类继承的类必须使用它的所有属性和方法——几乎不可能创建一个干净的架构
多层次的继承。
接口的主要优点是灵活性 -
您可以实现其中的大部分,但不必更改
你的类的内部结构来实现它们。
在大多数情况下,使用接口是最佳做法,但在某些情况下除外
软件模式,例如组合模式或策略模式。
但最终由您决定 - 您必须选择
您希望在项目中使用的继承类型。
接口帮助您获得灵活性,抽象类带来更多
与您的体系结构的凝聚力,因为它们将类分组
相似在一起。 --> 你可以重用抽象类的代码
它的子类
【解决方案2】:
如果您想使用与基类相同的代码并使用额外的功能对其进行扩展,则从基类继承非常有用。
Vitual 和 abstract 都与此有关。您可以使用基本实现创建虚拟方法。后代类可以(可选地)更改或添加到此实现。抽象类是本身不完整的基类。声明了一个抽象方法,但还没有实现。后代类必须提供实现。如果基类实现了一个流,这很有用,但该流的一部分需要由另一个类实现。基类需要能够调用该部分,这就是声明抽象方法的地方。
界面是另一回事。接口是关于类中存在哪些方法的约定,但它们可以由两个完全不相关的类实现。这很方便,因为您可以为小块功能制作小接口。例如,可以保存的东西可以实现 ISavable,它只是强制方法“保存”的存在。两个完全不同的类可以实现这一点,例如允许保存所有功能来保存可以保存的所有内容。
多重继承是一种特定的语言特性,在许多语言中不可用,但在许多语言中,您可以通过使用接口和 delegate 设计模式获得类似的效果。
【解决方案3】:
一般来说,当你想指定一个类应该做什么工作时,使用接口,而不是如何它应该这样做。例如,排序函数可能仅适用于实现某种Comparable 接口的类对象数组,该接口要求它实现比较运算符,但它并不关心这种比较究竟是如何工作的。
另一方面,抽象类将包含一些实际的代码。 Comparable 抽象类可能会使用比较运算符实现各种算法,但除非您在子类中实际实现此类运算符,否则它还不能被实例化。
一个类不能扩展多个超类,因为所谓的菱形问题(和类似的事情)。但是,接口不携带任何代码,所以这不是问题,您可以在单个类中实现多个接口。