作者lueichun (no anonymous)
看板java
标题[问题] is-a的意义
时间Thu May 3 21:05:15 2018
在讲解继承语法的文章内
都会讲到子类别复制了父类别的内容
然後子类别又能去override从父类别复制过来的东西 并新增父类别没有的东西
然後子类别就is-a父类别
但我不懂的是
既然子类别复制父类别的东西 会去修改它
然後又会增加新的 专属於自己的东西
那为什麽还可以说
子类别is-a父类别
说子类别包含(include)父类别不是比较合理?
介绍相关议题的文章 通常是直接举例说明
例如父类别是动物 子类别是猫 狗
但总觉得用这样的例子来说明 有种以偏概全的FU
不知道有没有更general的解释?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.230.20.30
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1525352718.A.2F8.html
※ 编辑: lueichun (36.230.20.30), 05/03/2018 21:09:04
1F:→ yuxds: 我觉得不能说是以偏概全 而是那样的情况你才会用继承 05/03 21:32
2F:→ yuxds: 不会说 我要一台跑车 然後跑车去继承动物类别再改写内容 05/03 21:33
这正是我想到的点 如果我今天故意拿跑车继承动物
那按照语法 就变成跑车is a动物
听起来就很不合理
3F:推 yuxds: 我觉得你可以举个例子 05/03 21:53
4F:→ yuxds: 怎样的情况是你会用继承 然後用子包含父类别是听起来很顺的 05/03 21:53
5F:推 LPH66: is-a 这个名字会这麽叫就是用英文的 is a 连起来表示关系 05/03 23:54
6F:→ LPH66: 狗 is a 动物 ← 像是这种关系 05/03 23:55
7F:→ LPH66: 也就是说动物能做的事狗也能做, 虽然怎麽做可能不尽相同 05/03 23:55
8F:→ LPH66: 你需要动物做事的地方你可以抓一只狗来 05/03 23:56
但是如果是我上面举的跑车继承动物例子 就很怪了
9F:→ ssccg: 修改是指改内部的实作,对外的介面是不能变的 05/04 02:30
10F:→ ssccg: 对外部来说,就可以把子类别的物件当成父类别的物件来用 05/04 02:33
这里不是很懂 可以再解释一下「对外的介面是不能变」的意思吗
11F:→ ssccg: 子类别的物件就是一个(is-a)父类别的物件 05/04 02:33
12F:→ ssccg: 物件导向的封装就是只看公开介面,去想里面怎麽做的就偏了 05/04 02:37
13F:→ ssccg: 对compiler或interpreter来说要实作这种设计当然会变成记忆 05/04 02:38
14F:→ ssccg: 体里子类别的那份里面要放一份父类别的东西,但是那不是你 05/04 02:39
15F:→ ssccg: 时要去担心的事 05/04 02:42
※ 编辑: lueichun (59.120.148.217), 05/04/2018 09:58:35
16F:→ pttworld: 那是你取名叫跑车,取名黑豹不就是了 05/04 10:21
17F:→ pttworld: 另一点因为继承动物,你的跑车只会有动物的特性 05/04 10:22
18F:→ pttworld: 不会因为他叫跑车就多了引擎和轮子 05/04 10:23
19F:→ pttworld: 即使你在跑车类新增引擎轮子,他只是像动物的跑车 05/04 10:24
20F:→ ssccg: 以你的例子来说,假设跑车继承动物(用哺乳动物比较单纯) 05/04 10:46
21F:→ ssccg: 这个跑车外显行为一定有会呼吸、两性生殖、会哺乳..等 05/04 10:47
22F:→ ssccg: 继承了什麽就决定了它是什麽 05/04 10:48
23F:→ ssccg: 你会说出跑车继承动物其实观念就有问题,不是先有两个类别 05/04 10:48
24F:→ ssccg: 再去套继承关系,是先有父类别,子类别一定是其衍生 05/04 10:48
25F:推 gmoz: 请从用途跟需求出发 05/04 16:04
※ 编辑: lueichun (36.230.19.60), 05/04/2018 21:09:39