當初在學習面向對象的時候,對於【繼承】的第一印象就是得到了父的全部方法和屬性,因此相對於繼承了父的功能和職責。然後面本身的設計也是基於這個原則,就是複用原則,複用父項的方法原則。慢慢的延伸就是有多個子類,就會把幾個子類共用的一些方法放到父類裏面,而這種設計思想深深的影響了本身好久。學習
而這種方法卻在近年來被本身慢慢的推翻,如今使用繼承的第一原則就是模板,Template。經過父類使用Template模式,構造出子類的流程,而本身只是在對應的鉤子方法(Hook)裏面填充着差別的地方,若是不是這種狀況,我會盡可能的減小繼承的使用。對於原來的把子類的方法推到父類的方法裏面,則經過其它的方式進行消除掉了。形成這種變化,只是源於一個原則的影響,【一切私有方法都是有罪的】。編碼
在編碼的時候,大量的把方法推到父類以後,才發現這些方法,別的地方也會須要,而這個時候,就很痛苦,由於經過繼承確定不行,可是不繼承,別的地方就須要copy一份,不copy就須要把這個方法變成靜態的方法,而這個時候,就會出現很奇怪的關係了。這種問題,我通常都是把這些方法歸屬到幾個其它類中,由於調用super.method(),和調用Other.method()實際上代碼是同樣的,都沒有減小和增長,可是類的職責卻清晰了不少。spa
近些年隨着IOC的增多,那麼Template的使用也天然增多了不少,因此也天然的傾向於父類定義流程,子類實現差別的方式來作,而不是父類提供方法,子類進行組裝。兩種差別的直觀比較,見下面的代碼。設計
第一種方式:父類提供大量方法,子類組裝code
1 public class FatherMehod { 2 3 protected void a() { 4 // doSomeThing 5 } 6 7 protected void b() { 8 // doSomeThing 9 } 10 11 protected void c() { 12 // doSomeThing 13 } 14 15 }
1 public class SonSetup extends FatherMehod { 2 public void doProcess() { 3 a(); 4 b(); 5 c(); 6 } 7 }
第二種方法:父類提供流程,子類實現差別(Template)對象
1 public abstract class FatherTemplate { 2 public void doProcess() { 3 a(); 4 b(); 5 c(); 6 } 7 8 protected abstract void a(); 9 protected abstract void b(); 10 protected abstract void c(); 11 }
1 public class SonDiff extends FatherTemplate{ 2 3 protected void a() { 4 // doSomeThing 5 } 6 7 protected void b() { 8 // doSomeThing 9 } 10 11 protected void c() { 12 // doSomeThing 13 } 14 15 }
差別就在於在第一種方式裏面子類實現的代碼,變成父類實現了,實現了控制反轉(IOC),這個就是個人繼承的第一原則,Template。blog