作者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/m.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