作者mc18 (无道德事业集团)
看板java
标题Re: [问题] Abstract 和 Interface 差别?
时间Wed May 20 02:22:54 2009
补充一些abstract class与interface的东西,
就比较学术上的说法, 这两种东西其实有点像, 但实际上是差很多的东西,
别人对这两个东西的定义是这样的:
Interface:
An Interface is a special type of class that only provides a specification
(not an implementation) for its abstract members.
Abstract classes:
The main purpose of an abstract class is to define a common interface for
its subclasses.
Interface的部分Alien大说的我想已经相当明白, 它只负责定义一个规格或功能, 你的
classes可以选择是否要"支援"这个功能, 支援了之後你可以选择在你想要使用它的时候
使用它.
但规格制定出来, 要怎麽去实行(implements), 当然得看你选择去实作的class, 所以
compiler才会强制你要去实作该interface制定的规格(除非你这个实作的class是
abstract的)
举例来说, 假设我是一个物件, 我实作了两个介面: 上班族 and 男朋友, 那我在办公室
的时候, 就是以"上班族"这个介面做操作, 其他同事都是透过"上班族"这个介面与我沟通
, 同样的, 回到家後, 我便会换上"男朋友"这个介面. 这样的话, 我就不会在上班的时候
, 不小心被别人invoke到"男朋友"这个介面中的方法, 我在面对闪光时也不会被呼叫到
"上班族"这个介面的方法(成员), 但事实上我是实作这两个介面. 这与您所提到的"多重
继承"是有相当大的出入的...
继承比较多应该是用在Gen-spec(generalization-specialization)的概念上, 如同Alien
大说的, 就是一种"is-a", 或"is-a-kind-of"的概念, 那至於到底是不是继承abstract
classes, 在这概念上则不重要了.
例如:
BMWCar继承Car, ToyotaCar也继承Car, 则我们可以说, ToyotaCar "is a kind of" Car,
当然, BMWCar "is a kind of" Car, 而在现实世界中, Car可以是一种具体的物件.
(谁说Car一定要有品牌= =, 铁牛车也是Car阿!!!!!)
但假设是:
男人 继承 人, 女人 继承 人, 当然我们可以说 男人 is-a-kind-of 人, 但这这个例子
中要注意的是, 既然有定义男人, 女人, 那"人"本身就不可是一个具体的物件, 因为人
不是男就是女(general case), "人"这个东西不该被实体化, 因为这样会不合理, 所以
在这个地方, 我会建议将"人"这个class设为abstract. 但"人"这个class仍然可以实作
大部分男女人都有的特性, 例如"人"都会有眼睛, 鼻子, 嘴巴等.
那至於什麽时候要用interface, 什麽时候做abstract class呢?
在这之前你可能必须要先回头来看, Object的原意是什麽, 为什麽程式要OO?
An Object is an abstraction of a set of real world things.
[Shlaer et al. 1992].
更精确的说,
An object is an entity that has responsibilities. i.e., it is responsible for
itself. These responsibilities define the behavior of the object
[Shalloway et al. 2005]
所以回归到源头, 还是要先得把对物件的观念厘清, 才能够设计出适合的抽象化结构.
note: 不是把结构弄得越抽像越好, 这样实作的人也会把code写得很抽象....
"适当"的抽象化, 就够了...
献丑了...
※ 引述《adrianshum (Alien)》之铭言:
: 这些很难在三言两语里解说得完
: 很多是要你有一定程度和有设计的经验才能了解.
: 只抽取一些明显的错误和基本的概念答一答吧
: ※ 引述《ieping (maggie)》之铭言:
: : 我只知道:
: : Interface:
: : 1.介面
: : 2.须加static
: 没有须加 static 这事.
: 你说得太含糊根本不知道你想表达什麽
: : 3.不能实做方法
: : 4.通常用在多重继承
: interface 和多重继承有本质上很大的差别.
: 只可以说, 多重继承其中一种常用的状况, 能以
: interface 达成
: : 5.若类别要做interface要加上implements 介面_名称
: : Abstract:
: : 1.抽象
: : 2.抽想类别
: : 3.抽想方法
: 抽想?
: 你上面列这三句也是不知道你想说啥
: : 4.可以实做
: : 问题:
: : 1.以上,还有其他的吗?
: 了解他们本质上的分别, 比这些有的没的比较来得有用
: : 2.我有看人没有先用extends 类别_名称 直接 再类别用implements出好多的 介面
: : 是不是这样也可以?但不太知道代表的意思or概念?
: 可以
: : 谢谢高手们~
: 以前看过某人,用了一个例子来说明 base class 和 interface 的分别.
: (忘了是谁了, 请谅)
: extends 一个 base class, 指的是 'is-a' 的关系
: interface 则是该物支援的介面
: 比如一部电视机, 它 是一个 (is-a) 电器.
: 所以很自然, 电器是一个 class, 电视机 extends 电器
: 电视机支援 100v 电源输入
: 100v 电源输入是一个介面 (interface), 也很自然, 你可
: 以说
: 电视机 支援 (implements) 100v电源输入
: 但你不会说
: 电视机 是一个 100v电源输入
: 能感受到两者分别, 就是了解 class 和 interface 含义的最初也是最重要一步
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.84.65.145
※ 编辑: mc18 来自: 219.84.65.145 (05/20 02:31)
※ 编辑: mc18 来自: 219.84.65.145 (05/20 02:34)
1F:推 DavyBlue:好文推 05/20 12:29
2F:推 pauleagle:推这个好的观念讲解 05/20 15:00
3F:推 tangblack:好文 推 06/03 11:22