我已经看过接口,抽象类和继承的用法。我看到每个都有它们的用途,但我仍然有些困惑。
我知道通常一个类只能扩展另一个类,虽然有些类可能支持多重继承,但它可以实现多个接口(这可能是使用接口的主要原因)。但是,如果我是正确的,这个类也可以被另一个类扩展。我还看到抽象类可能比接口更快,并且可以有非静态的最终变量。
所以,我仍然不确定何时使用哪个更好。也许通过举一些例子可以更好地理解这一点。我并不反对使用任何东西,但我认为有些东西是我看不到的。进一步的解释也许有帮助。提前谢谢。
答案 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
抽象类可能使用比较运算符实现各种算法,但除非您在子类中实际实现此类运算符,否则它尚未准备好实例化。
由于所谓的钻石问题(以及类似的东西),一个类不能扩展多个超级类。但是,接口不会携带任何代码,因此这不是问题,您可以在单个类中实现多个接口。