Re: [問題] 父變數指到子物件的繼承問題
※ 引述《Shrugg (淚眼問花花不語)》之銘言:
: 對不起,又碰到觀念性問題想不通了,所以藉休息思考時間又來這邊尋找溫情.嘻
: 請問當程式跑到 Father f = new Son()後,從記憶體來看
: 不是就一個Stack區的變數f指向Heap區的一個Son物件嗎?
: 如果這時候執行f.show() 為什麼IntelliSense只能選擇父類別裡的show()?
: 但是如果父類跟子類同時有定義show(),即使選用的是父類的show()
: 卻是顯示子類show()的內容呢?
: 從物件來看,父類跟子類會有不同的方法跟成員變數,可以理解是不同的東西
: 但是變數的目的不是存值就是存參照,變數為什麼會有父跟子的區分呢?
: 謝謝.
把 Father 換成 動物
把 Son 換成 鴨子
把 show 換成 走
即:
動物 f = new 鴨子();
定義 f 為動物,而且這個動物是鴨子
而在操作的時候,光看 f 怎麼會知道它是鴨子還是鳥~或是別的動物?
所以當然只能選擇父類別(動物)裡的 走()
而這個走()的方法~在父類別裡面不是有實作~就是有 abstract 要子類別實作
鴨子繼承了動物這個類別~也就理所當然有 走() 這個方法
差別在於子類別是否要自己實作
父類別有實作就是用父類別的~除非被子類別覆寫掉了
再講簡單一點
現在我有一堆動物~老虎、鴨子、兔子、人...等等
之所以定義成父類別,就是不打算知道那是什麼動物
要牠去哪就去哪~走()就對了!!!
至於這些動物怎麼走()? 當然就要這些動物自己去實作
所以當然是顯示子類別的內容...
(除非父類別有實作~而子類別沒覆寫)
建議原PO可以看看"深入淺出-設計模式"第一章
上面的例子其實比較偏向"介面"
但是個人認為這樣說明比較容易理解
通常之所以要弄成父類別和子類別
就是子類別為了要有父類別的"東西"
就像我老爸是李嘉誠~我當然想要繼承他的財產和能力
乍看之下很好!!!
可是...有句話叫"父債子償"
既然繼承了~就是全部都收了!不論好壞!
當然最顯而易見的問題就是老爸的東西~你不見得全部都喜歡
一旦繼承多了~就像政府舉債一樣~債留子孫!
後面的為了合乎所用~覆寫再覆寫~牽制再牽制
然後就天下大亂了...Q_Q
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.152.17
※ 編輯: andymai 來自: 122.117.152.17 (04/27 17:18)
討論串 (同標題文章)