[.net 面向對象編程基礎] (12) 面向對象三大特性——繼承

[.net 面向對象編程基礎] (12) 面向對象三大特性——繼承html

 

     上節咱們說了面向對象的三大特性之一的封裝,解決了將對同一對象所能操做的全部信息放在一塊兒,實現統一對外調用,實現了同一對象的複用,下降了耦合。編程

     但在實際應用中,有好多對象具備相同或者類似的屬性,好比有一個對象 果樹(FruitTree),它有成員屬性葉子(Leaf),會開花(Flower),有樹幹(Stem),有樹根(Root),它還會生長(Growth方法)。app

     有另外一個對象蘋果樹(AppleTree)它也是果樹,具備果樹全部特性,那麼咱們在編程的時候,定義了一個蘋果樹對象,假如再有一個桔子樹(OrangeTree)、桃樹(PeachTree)呢,咱們不能一直複製這個對象更名字實現吧?這裏就要用到面向對象的第二個特性:繼承。

函數

1.什麼是繼承ui

     上面的果樹(FruitTree) 和桔樹(OrangeTree)之間是一個「 is-a 」的關係,即咱們能夠說 「桔樹是果樹」。在面向對象編程中,咱們把這種關係稱爲 「繼承」,即桔樹繼承自果樹。或者說,桔樹類是果樹類的派生類;也能夠說果樹是父類,桔樹是子類。一樣的蘋果樹也能夠繼承果樹,那麼蘋果樹也能夠說是果樹的子類。在這裏咱們發現一個類能夠有多個派生類,也就是一個類能夠被多個類繼承.this

經過上面的實例,咱們總結一下繼承相關的概念:spa

(1) 當一個類A可以獲取另外一個類B中全部非私有的數據和操做的定義做爲本身的部分或所有成分時,就稱這兩個類之間具備繼承關係。.net

(2) 被繼承的類B稱爲父類或基類,繼承了父類的類A稱爲子類或派生類.

code

2.繼承的特色htm

上面的例子,假如蘋果樹繼承自果樹,那麼蘋果樹除了具備果樹全部的屬性(葉子,根、花)和方法(生長)以外,蘋果樹還有本身特有的一些屬性,好比有本身的果實蘋果(Apple); 一樣桃樹有本身的果實桃子(Peach),所以繼承的子類能夠有本身獨有的成員(屬性或方法等)。

特色一:派生類除了繼承父類的特性外,還能夠有本身獨有特性

上面說到的父類果樹(FruitTree)除了有葉子、根、花這些公有的成員以外,也能夠有本身的私有成員,好比種類(落葉果樹、常綠果樹),而「種類」這個成員,並非它的子類蘋果樹(AppleTree)和桔樹(OrangeTree)所具備的,所以是私有成員,子類繼承父類後,並不能擁有父類的私有成員。

特色二:子類不能擁有父類的私有成員

仍是上面的例子,假若是樹有一個公有方法生長(Growth),它有兩個子類桃樹和蘋果樹,那麼子類也同時擁有生長這個方法,可是桃樹和蘋果樹的生長過程是不一樣的,咱們能夠修改這個方法以適應不一樣種類果樹的生長。

特色三:子類能夠以本身的方式實現父類的功能(即方法重寫,這個在後面專門介紹)

3.繼承的實現

     經過上面的例子,咱們已經對繼承很熟悉了,拋開概念。簡單的說,繼承一詞本就來源於生活,有財產繼承,精神繼承。面向對象編程只不過就是把這些概念抽象化而已,通俗來講就是「蘋果樹是一顆果樹」   

代碼實現上面的例子   

  1     /// <summary>
  2     /// 果樹類
  3     /// </summary>
  4     class FruitTree
  5     {
  6         /// <summary>
  7         /// 名稱
  8         /// 說明:修飾符 protected 保護訪問。只限於本類和子類訪問,實例不能訪問。
  9         /// </summary>
 10         protected string name;
 11         /// <summary>
 12         /// 構造函數
 13         /// </summary>
 14         public FruitTree()
 15         {
 16             this.name = "無名";
 17         }
 18         /// <summary>
 19         /// 構造函數二
 20         /// </summary>
 21         /// <param name="name"></param>
 22         public FruitTree(string name)
 23         {
 24             this.name = name;
 25         }
 26         object _leaf;
 27         object _root;
 28         object _flower;
 29         string _type;
 30         /// <summary>
 31         /// 葉子(公有屬性)
 32         /// </summary>
 33         public object leaf
 34         {
 35             get { return _leaf; }
 36             set { _leaf = value; }
 37         }
 38         /// <summary>
 39         /// 根(公有屬性)
 40         /// </summary>
 41         public object root
 42         {
 43             get { return _root; }
 44             set { _root = value; }
 45         }
 46         /// <summary>
 47         /// 花(公有屬性)
 48         /// </summary>
 49         public object flower
 50         {
 51             get { return _flower; }
 52             set { _flower = value; }
 53         }
 54         /// <summary>
 55         /// 類別(不定義修飾符,默認爲私有)
 56         /// </summary>
 57         string type
 58         {
 59             get { return _type; }
 60             set { _type = value; }
 61         }
 62   
 63     }
 64 
 65     /// <summary>
 66     /// 蘋果樹類
 67     /// 繼承自:果樹類
 68     /// </summary>
 69     class AppleTree:FruitTree
 70     {
 71         string _myName;
 72         /// <summary>
 73         /// 構造函數
 74         /// 說明:子類調用父類一樣的構造函數,須要使用 :base()
 75         /// </summary>
 76         public AppleTree():base()
 77         {          
 78         }
 79         /// <summary>
 80         /// 構造函數二
 81         /// 說明:子類調用父類一樣的構造函數,須要使用 :base(name)
 82         /// </summary>
 83         /// <param name="name"></param>
 84         public AppleTree(string name):base(name)
 85         {
 86             _myName = name;
 87         }             
 88 
 89         /// <summary>
 90         /// 返回果實的名字
 91         /// </summary>
 92         /// <returns></returns>
 93         public string MyFruitName()
 94         {
 95             return "我是:" + _myName + ";個人果實叫:蘋果";
 96         }
 97     }
 98     /// <summary>
 99     /// 桔樹類
100     /// 繼承自:果樹類
101     /// </summary>
102     class OrangeTree : FruitTree
103     {
104         string _myName;
105         /// <summary>
106         /// 構造函數
107         /// 說明:子類調用父類一樣的構造函數,須要使用 :base()
108         /// </summary>
109         public OrangeTree(): base()
110         {
111         }
112         /// <summary>
113         /// 構造函數二
114         /// 說明:子類調用父類一樣的構造函數,須要使用 :base(name)
115         /// </summary>
116         /// <param name="name"></param>
117         public OrangeTree(string name): base(name)
118         {
119             _myName = name;
120         }
121 
122         /// <summary>
123         /// 返回果實的名字
124         /// </summary>
125         /// <returns></returns>
126         public string MyFruitName()
127         {
128             return "我是:"+_myName+";個人果實叫:桔子";
129         }
130     }

調用子類:

//調用子類
AppleTree appleTree = new AppleTree("蘋果樹");
string myName = appleTree.MyFruitName();
//返回結果爲:我是:蘋果樹;個人果實叫:蘋果

 

//調用子類
OrangeTree orangeTree = new OrangeTree("桔子樹");
string myName = orangeTree. MyFruitName ();
//返回結果爲:我是:桔子樹;個人果實叫:桔子

      通這段代碼,咱們能夠看到有了基類果樹,那麼咱們再有幾百種樹,只須要一個繼承就能夠了,對於子類AppleTree.MyFruitName()返回名字這個方法,在不一樣子類中能夠特有,就是繼承的特色,能夠增長特有成員。雖然對於獨有特色須要在每一個子類中單獨定義,可是共享父類成員已經讓咱們省去很多工做量了,最重要的程序的結構更加清晰、易於維護了。

 

4.繼承的缺點

     看到這個標題,小夥伴們也許很驚訝,既然說了這麼多面向對象繼承特性的好處,原來還有缺點。固然,世界上沒有完美的東西,繼承也是。

     缺點一:父類變化,子類不得不變;

     缺點二:繼承破壞了包裝,父類的細節暴露給了子類。

     前一節說了封裝的獨立特性,是減小了耦合性,而繼承其爲了實現複用卻增長了耦合性。

     說到這裏小夥伴們糾結了,那麼到底要不要使用繼承,答案是確定的,它的優勢和光芒掩蓋了缺點,也就是說好處更多一些。這裏說明它的缺點,就是提醒咱們在使用過程當中儘可能避免它的缺點所帶來的後果。

     那麼要如何才能很好的使用繼承呢?咱們應該注意這麼幾點:

a.當兩個對象間是「is a」關係時,可使用繼承(好比蘋果樹是樹);b.當兩個對象是「as a」關係時,不宜使用繼承(好比手是人的一部分,不能讓手繼承人);

     對於繼承的優缺點,咱們記住一點:要合理使用繼承,才能發揮最佳效果,而不是盲目使用。

 

     做爲面向對象的三大特性之一:繼承,能夠說是學好面向對象編程的重中之重,因些本節能夠說是這個系列的重點,沒有之一。

    小夥伴們,又是凌晨了,明天繼續寫。最後按慣例寫幾點使用繼承須要注意的地方。

 

要點:

1:父類中的私有成員,派生類是毫不能訪問;

2:C#要求一個類只能有一個直接基類;

3:被「sealed」關鍵字修飾的類將不能被繼承;

4:被「protected」修飾的成員或者數據能夠直接被派生類訪問,屬於「能夠在家族裏分享的祕密」。

5:善用「base」關鍵字,顯示調用合適的自定義基類構造函數而不是使用默認構造函數。

6:繼承須要合理使用才能發揮最佳效果,通常狀況下適用於「is a」關係,不適用「has a」關係。

 

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

返回目錄

 <若是對你有幫助,記得點一下推薦哦,有不明白的地方或寫的不對的地方,請多交流>

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

相關文章
相關標籤/搜索