如何解释接口和抽象类与非程序员之间的区别?

Fra*_*ank 20 oop abstract-class interface

可能重复:
何时使用接口而不是抽象类,反之亦然?

嗨,我正在向非程序员教授OOP概念.我想知道如何解释接口和抽象类之间的区别.
我实际上正在寻找的,是一个真实世界的例子,可以帮助突出两者之间的差异.

Col*_*ert 35

播放器界面

在我的Java课程中,我经常使用它 接口 那种形象并问:"这是什么?"

每次有人会说"那是一名球员".从这张图片中你可以教任何人界面是什么.此接口允许任何用户"播放"某些内容.每个人都知道这些按钮的含义,即使你不知道将要做什么,你可以使用这个界面的任何东西,你知道小箭头将"播放",其他箭头可能会向前或向后发送你.具有这些按钮的所有内容都将提供任何用户在开始使用之前都会知道的标准行为.

我通常会尽量避免可能被误解的"契约"一词.

DVD播放器抽象类

然后从Play界面,我转到录像机(或DVD)播放器.DVD播放器的每个构造函数都必须添加一些特殊功能,以将简单的未知播放器转换为DVD播放器.例如弹出按钮.他们必须正确实施播放器.
播放按钮将启动DVD的内容.

但即使DVD播放器提供DVD播放器的基本行为,也不是一切都已完成.你不能简单地拥有"一个"DVD播放器,它有一个品牌,大多数时候它有自己的固件.这次你需要扩展DVD Player抽象类来添加你自己的小组件.

  • 这两个例子实际上只是接口 - 很难给出抽象类的真实示例. (7认同)
  • "+ 1"来自我这个精彩的比喻.如果你班上的其他人都和这个例子一样好,我希望你能教更多学生...... (3认同)
  • @Michael实际上我强调DVD播放器已经定义了一些行为这一事实.即使它不完整,每个DVD播放器基本上都会以相同的方式运行.因为你不能拥有"一个"DVD播放器,它无法实例化,而且它是抽象的. (2认同)
  • 你不能拥有"一个"球员.我必须同意迈克尔的看法,这个例子中的区别并不十分清楚. (2认同)
  • @Michael:这可能是一个沟通问题/误解.在C++中,抽象基类用作接口.从这个POV,接口只是抽象基类的一个子集:那些只有没有实现的纯虚函数,没有数据成员和默认构造函数的基类.尽管如此,在C++中使用抽象基类作为接口仍然不同于其他用途,尽管这些语言不会强制区分. (2认同)

cas*_*nca 21

这里有两个很好的比较:接口与抽象类.我从下面复制了一个具体的例子:

接口

接口通常用于描述类的外围能力,而不是其中心标识,例如,汽车类可能实现Recyclable接口,该接口可以应用于许多其他完全不相关的对象.

抽象类

抽象类定义其后代的核心标识.如果你定义了一个狗抽象类,那么达尔马提亚的后代就是狗,他们不仅仅是可爱的.已实现的接口枚举了类可以执行的一般操作,而不是类的内容.

  • 虽然我同意这个答案的大部分内容,但使用狗来说明抽象类是误导性的(没有冒犯).如果学生应该只理解一件事,那就是OOD是关于行为,而不是分类.在任何方面,dalmation都不会*表现出任何不同的行为*.它吠叫,摇尾巴,等等.没有必要为它创建衍生类. (3认同)