繼承的第一原則

       當初在學習面向對象的時候,對於【繼承】的第一印象就是得到了父的全部方法和屬性,因此相對於繼承了父的功能和職責。然後面本身的設計也是基於這個原則,就是複用原則,複用父項的方法原則。慢慢的延伸就是有多個子類,就會把幾個子類共用的一些方法放到父類裏面,而這種設計思想深深的影響了本身好久。學習

 

       而這種方法卻在近年來被本身慢慢的推翻,如今使用繼承的第一原則就是模板,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

相關文章
相關標籤/搜索