【问题标题】:OOP Principle Differences between Interfaces and Abstract Classes接口和抽象类的OOP原理区别
【发布时间】:2016-11-28 04:13:08
【问题描述】:

我知道抽象类是包含声明方法的类,这些方法不一定都有指定的实现,因为代码必须在子类中声明,但我发现很难理解引入背后的 OOP 概念接口。

如果抽象类没有定义的方法和状态(除了抽象类可以有构造函数),接口和抽象类在架构和原理上的区别是什么?

此外,为什么任何人都应该首先使用抽象类和接口?我知道它对您的代码增加了限制,不允许人们在没有指定方法的情况下定义子类,但是如果接口和抽象类中不存在未实现的声明方法,则代码将以完全相同的方式工作。那么编写没有实现的方法只是为了稍后在子类中实现它的隐含好处是什么?

我看过很多关于接口与抽象类的帖子,但我对两者之间的原则差异感兴趣,而不是它们的功能差异。

【问题讨论】:

  • 对我来说,接口是一种与 API 消费者强制执行合同的方法 - 例如。一个汽车接口——应该有四个轮子,应该有方向盘——没有例外。抽象类用于抽象对象的行为,例如 for一个活的东西 - 一个非常抽象的物体,有许多不同的行为。所以将生物表示为抽象类
  • 你是先用谷歌搜索的吗?这个话题已经在这里完成了,肯定有解决这个问题的现有答案。
  • 我用谷歌搜索了它......也死了。我还没有经历那个“啊哈”的时刻,我在挣扎
  • 更多解释可能无济于事。我的建议是查看 jdk 库源代码中的示例,从 java.util 开始,看看 java.util.List、ArrayList 和 AbstractList 是如何工作的,也许看看 java.sql。 java.io 有很好的在装饰器模式中使用接口的例子..

标签: oop interface abstract


【解决方案1】:

一年后回到我自己的问题,我找到了我想要的答案。

一个类,无论是否抽象,总是试图定义/设计实体从它们的行为到它们的状态的样子。在抽象类的情况下,我们正在建模一个我们不想在运行时实例化的想法/实体。例如,如果我们有一个关于狗和猫的应用程序,我们可能想要定义什么是动物,然后通过扩展我们的基础动物类来扩展这个想法以定义什么是狗/猫。动物对象永远不会被实例化,但狗/猫会。

另一方面,接口是一组方法,代表了任何类都期望的某种形式的交互。只要一个类实现了一个接口,你就知道可以从它那里得到什么方法。因此,您可以有两个彼此不相关的实体(类)实现相同的接口。例如,狗和人类可能都实现了“摘要”接口。这意味着它们都能够消化食物,因为我们已经明确说明了界面中期望哪些功能能够实现食物消化行为。显然,实现的细节有所不同,因此接口中定义的函数在实现它们的类中进行了概述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2010-12-27
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多