Inheritance and Composition --繼承與組合
參考連結:網頁連結
前言:繼承與組合是程式設計的兩種方式。繼承完全可以用組合來代替,而且要儘量避免多繼承。
繼承與組合的概念:
繼承:一個類可以從另一個類繼承屬性,類似父子關係,一脈相承但不完全相同。
組合:一個類可以由其他類組成,類似車與輪子的關係。
繼承可以用組合代替:
關於繼承,我們知道父類與子類有三種互動方式:子類暗含這父類的行為;子類覆蓋父類的行為;子類alter父類的行為。
我們下面使用程式碼進行解釋,首先來一段使用繼承的程式碼:
class Parent(): def override(self): print("PARENT override()") def implicit(self): print("PARENT implicit()") def altered(self): print("PARENT altered()") class Child(Parent): def override(self): print("CHILD override()") def altered(self): print("CHILD,BEFORE PARENT altered()") super(Child,self).altered() print("CHILD,AFTER PARENT altered()") dad = Parent() son = Child() dad.implicit() son.implicit() dad.override() son.override() dad.altered() son.altered()
output:
PARENT implicit()
PARENT implicit()
PARENT override()
CHILD override()
PARENT altered()
CHILD,BEFORE PARENT altered()
PARENT altered()
CHILD,AFTER PARENT altered()
再來一段組合的程式碼來實現上面的功能:
class Other(): def __init__(self): self.name = "other" def override(self): print("OTHER override()") def implicit(self): print("OTHER implicit()") def altered(self): print("OTHER altered()") class Child(): def __init__(self): self.sex = "boy" self.other = Other() def implicit(self): self.other.implicit() def override(self): print("CHILD override()") def altered(self): print("CHILD,BEFORE OTHER altered()") self.other.altered() print("CHILD,AFTER OTHER altered()") other = Other() son = Child() print(other.name) print(son.other.name,son.sex) other.implicit() son.implicit() other.override() son.override() other.altered() son.altered()
other
other boy
OTHER implicit()
OTHER implicit()
OTHER override()
CHILD override()
OTHER altered()
CHILD,BEFORE OTHER altered()
OTHER altered()
CHILD,AFTER OTHER altered()
可見組合也完成了與繼承相同的功能.
那麼,我們何時使用繼承,何時使用組合呢?這裡有三個原則:
-
不惜一切代價避免多繼承。
-
使用組合將程式碼打包為模組,這樣模組可以用在很多不同不相關的地方上。
-
僅當有明顯相關的可重複使用的程式碼片段符合單一通用概念或者由於你從事的事情不得不使用繼承時才使用繼承。
不要拘泥於這些規則,學會根據實際情況應變。
參考:Learn python3 the hard way