iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 15
1

本篇擷取重點:

  • 繼承
    • 繼承的目的及手段
    • 繼承的類別階層
    • 其他和繼承相關的問題

一、繼承(Inheritance

繼承是一種類別間的階層式分類關係,可用現有類別衍生出新類別。新類別可繼承(延伸)現有類別的屬性和方法。

  • 被繼承的對象稱為基底類別(Base)、超類別(Super)或親類別(Parent);
  • 繼承者稱為衍生類別(Derived)、次類別(Sub-)或子類別(Child)。
  • 繼承的目的,是要達到「程式碼再用」(Code Reuse)或「介面再用」。
  • 繼承的手段,就是「擴充」或「修改」。這是重點,請務必牢記。

二、繼承的目的及手段

本篇單就"程式碼再用"的部分做探討,"介面再用"部分筆者還不熟悉就先不討論了...

  1. 程式碼再用(Code Reuse

繼承所導致的程式碼再用,是指衍生類別能自動沿襲基底類別的所有程式碼,好讓你可以不用寫太多程式碼,只需要稍微擴充或修改,就能符合你的需求。

  • 擴充」指的是定義新的方法(Method);
  • 修改」指的是針對基底類別中的某方法重新定義其行為

==================================================================
貼心小補充:

請注意,繼承所產生的衍生類別和其基底類別之間,兩者在記憶體內是獨立的。繼承所做的擴充與修改,並不會影響到基底類別。

==================================================================


三、繼承的類別階層

將許多類別之間的繼承關係,繪製成一張關係圖,如果繪製時依循「基底類別在上,衍生類別在下」,或者「基底類別在左,衍生類別在右」,就可以形成一個類別階層(Class Hierarchy)。

https://ithelp.ithome.com.tw/upload/images/20190916/20120056llRtwlFTcM.jpg

由於大多數的類別階層設計都是採用單一繼承(Single Inheritance),而非多重繼承(Multiple Inheritance),所以階層圖往往是樹狀結構,符合樹狀結構的階層圖,也稱為繼承樹、類別樹。

==================================================================
貼心小補充:

多重繼承與介面
單一繼承指的是,只有一個基底類別;多重繼承指的是,具有多個基底類別。應用框架設計幾乎都是採用單一繼承(例如MFC、.NET Framework、Borland VCL、AIR),只有極少數以前的設計會採用多重繼承(例如Borland OWL)。

不僅如此,連語言本身的設計上,也往往禁止多重繼承(例如Java、Delphi、C#、VB.NET),只剩下極少數語言允許多重繼承(例如C++、Eiffel)。這個趨勢似乎會延續下去,主要是因為多重繼承「可能」會造成「不知道繼承的方法,是來自那個基底類別或祖先類別的困擾」。

==================================================================


四、其他和繼承相關的問題

繼承在某些程度上破壞了一部分的封裝,造成衍生類別和基底類別的相依程度提高。基底類別如果改變,但是衍生類別沒有跟著做出改變,可能會造成衍生類別出問題

法律上有所謂的「限定繼承」與「拋棄繼承」,目前的編程語言似乎都沒有這樣的概念,就算有,權力也是放在基底類別上,而不是在衍生類別上。

參考資料:
https://www.ithome.com.tw/node/46085 (大推薦)



上一篇
[ASP.NET] [C#] 物件導向 - 物件能做的事,比你想的還要多
下一篇
[ASP.NET] [C#] 多載 (Overload)
系列文
ASP.NET Web Form 入門30天30

2 則留言

1
小朱
iT邦新手 4 級 ‧ 2019-09-16 12:00:50

建議介面這兩個字再定義清楚一點,否則有點難分辨是使用者介面 (user interface) 還是一般在OOP所說的介面 (interface)。

感謝小朱大大的熱心回應,不過,我發現介面對目前的我來說有點深,在自己還不熟悉的狀況下,應該不要誤人子弟XDD,所以決定先把這篇關於介面的部分刪除...

1
sion
iT邦新手 4 級 ‧ 2019-09-16 16:53:04

介面是實作(implement)不是繼承(Inheritance)
所以當然不被限制只能一個
interface翻接口可能好點

設計繼承時,必須先考慮介面是否共享,而後考慮程式碼是否共享,再考慮分類。但是經驗不足的編程員,反倒會先考慮分類和程式碼再用,而忽略了「介面再用」是其中最重要的事。

還有interface不是這樣用的.....

感謝sion大大的熱心回應,看完您的回覆讓我發現自己的誤解,而且距離真相還有一大段距離XDD,所以決定先把這篇關於介面的部分刪除,等未來足夠理解時再來探討這個部分...

我要留言

立即登入留言