当前位置: 首页 > 知识库问答 >
问题:

接口vs抽象和继承

尹何平
2023-03-14

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

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

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

共有3个答案

魏熠彤
2023-03-14

一般来说,当你想指定一个类应该做什么来工作时,请使用接口,但不要指定它应该如何工作。例如,排序函数可能只在实现某种可比接口的类对象数组上工作,该接口要求它实现比较运算符,但它并不关心这种比较是如何工作的。

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

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

罗波鸿
2023-03-14

这取决于你自己的风格。

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

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

在大多数情况下,使用接口是最佳实践,除了一些软件模式,如组合或策略模式。

但最终这是你的决定——你必须在项目中选择你想要的继承类型。

接口帮助您获得灵活性,抽象类为您的体系结构带来更多的内聚力,因为它们将相似的类组合在一起。--

刘棋
2023-03-14

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

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

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

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

 类似资料:
  • 我正在重构我的代码,所以我需要做出关于接口或抽象类的决定。我有基类Player和继承基类的类,称为VideoPlayer、MusicPlayer等。基类有抽象方法,没有实现(Play)。那么,最好的方法是什么?将Play放在接口中或将其留在抽象类中。在MusicPlayer中播放与在VideoPlayer中的播放器不同。我是用C#实现的。

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗

  • 问题内容: 在面试中,有人问我以下问题。我试图回答这个问题,但是我想确切回答这个问题。 如果我可以将Abstract类模拟为Interface,为什么Java提供了Interface? 这意味着如果在Abstract类中我可以将所有方法标记为abstract,然后abstract类将用作接口,那么为什么我需要接口。 谁能简单地解释一下我。 问题答案: 这是一个非常标准的面试问题。答案是:因为您可以

  • 问题内容: 谁能告诉我完全抽象的类和接口之间到底有什么区别? Abstract类也可以将其所有方法都作为abstract。接口的所有方法均为抽象。在这种情况下,两者之间的主要区别是什么? 纯抽象类和接口之间是否有区别?接口有什么用?在使用接口的地方,我们可以使用纯抽象类吗? 问题答案: 要完成以前的答案: 接口是一个“合同”。如果一个类实现一个接口,则它必须提议该接口中列出的所有服务。 抽象类是骨

  • 问题内容: 考虑一个示例(在Java中编译) 为什么必须将接口“声明”为抽象的?还有其他适用于抽象接口的规则吗? 最后:如果过时了,为什么将它包含在Java中?有抽象接口的历史吗? 问题答案: 为什么必须将接口“声明”为抽象的? 不是。 接口及其方法是隐式的,添加该修饰符没有区别。 还有其他适用于抽象接口的规则吗? 不,适用相同的规则。该方法必须由任何(具体)实现类来实现。 如果抽象已经过时,为什

  • 问题内容: 我有以下界面: 我在下面有抽象类(没有提到方法插入): 我有具体的课程: 最后,SpecificEntryBean定义为: 我有以下错误: 类型SpecificEntry必须实现继承的抽象方法SingleRecordInterface.insert(AbstractEntryBean) 考虑到SpecificEntryBean扩展了AbstractEntryBean,所以我不明白此错误