接口与抽象和继承

时间:2015-07-25 18:55:13

标签: inheritance interface abstract-class multiple-inheritance extends

我已经看过接口,抽象类和继承的用法。我看到每个都有它们的用途,但我仍然有些困惑。

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

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

3 个答案:

答案 0 :(得分:5)

如果要使用与基类相同的代码并使用额外的功能扩展它,则从基类继承非常有用。

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

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

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

答案 1 :(得分:0)

这取决于你自己的风格。

实际上,从抽象类继承的类必须使用它的所有属性和方法 - 创建一个干净的体系结构几乎是不可能的 许多级别的继承。

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

在大多数情况下,最好使用接口,但在某些情况下除外 像compositum或strategy pattern这样的软件模式。

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

接口可以帮助您获得灵活性,抽象类带来更多     对您的体系结构具有凝聚力,因为它们将类分组 类似的。 - >你可以重用你的抽象类代码 它的子类

答案 2 :(得分:0)

通常,当你想指定一个类应该做什么什么时,使用接口,而不是它应该如何。例如,排序函数可能只适用于实现某种<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script> <div class="medal"> <div class="ribbon"></div> <div class="coin"></div> </div>接口的类对象数组,该接口要求它实现比较运算符,但它并不关心这种比较的工作原理。

另一方面,抽象类将包含一些实际的代码Comparable抽象类可能使用比较运算符实现各种算法,但除非您在子类中实际实现此类运算符,否则它尚未准备好实例化。

由于所谓的钻石问题(以及类似的东西),一个类不能扩展多个超级类。但是,接口不会携带任何代码,因此这不是问题,您可以在单个类中实现多个接口。