C#中的繼承分為實現繼承和接口繼承,今天主要談一下實現繼承。
實現繼承表示一個類型派生於另一個基類型,該類型擁有基類型的所有成員字段和函數。在實現繼承中,派生類型的每個函數采用基類型的實現代碼。——摘自《C#高級編程第六版》92頁
為什麼要使用類繼承呢,舉個小例子,假如說我們之前有個類叫Peoplo(人類),他具有身高、體重等屬性,同時還具有吃飯、睡覺等方法,可是由於科技的進步人們又發明了機器人(Robot),它不但可以像人類那樣具有身高、體重,還能夠吃飯、睡覺外,它還具備人類所不具備的功能,例如機器人可以下潛到1000以下的深水中,如果沒有繼承,我們在定義Robot這個類的時候就得重復定義peoplo的成員和Robot所獨特的成員,增加了我們的負擔,使用繼承就可以很好的解決這個問題,如下:
先看Peoplo類
1public class Peoplo
2{
3 public int stature { get; set; }//身高
4 public int avoirdupois { get; set; }//體重
5 public Peoplo()
6 {
7 //
8 //TODO: 在此處添加構造函數邏輯
9 //
10 }
11 public string dining()//吃飯
12 {
13 return "今天的紅燒肉真好吃!";
14 }
15 public string dreamland()//睡覺
16 {
17 return "為什麼不是席夢思的床墊呢?";
18 }
19}
該類定義了stature和avoirdupois兩個屬性,dining和dreanland兩個方法。
再來看一下Robot類
1public class Robot:Peoplo
我想有必要先搞清楚什麼是基類,Robot由Peoplo派生而來,那麼Robot就是派生類而Peoplo就是基類,也可以這麼說Robot 是Peoplo的派生類,Peoplo是Robot的基類。
下面我們使用Robot rb=new Robot(),這樣我們得到了一個Robot類型的對象rb,那麼rb都具備什麼成員呢,沒錯,由於Robot繼承了Peoplo類。所以它具備以下成員:stature和avoirdupois兩個屬性,dining和dreanland兩個方法,還有就是自身的dive()方法。我們創建一個Default.aspx頁面來輸出結果驗證一下。
1public partial class _4_Default : System.Web.UI.Page
2{
3 Robot rb = new Robot();
4
5 protected void Page_Load(object sender, EventArgs e)
6 {
7 Response.Write(rb.dining());
8 }
9}
運行結果:今天的紅燒肉真好吃!
額的神啊,機器人怎麼開始吃肉了啊,科技再進步機器人也無法吃肉啊,看來Peoplo類中的屬性和方法不一定都適用於Robot啊,人類吃肉是用來補充能量,而機器人用什麼補充能量呢,沒錯,電!看來我們有必要在Robot類中重新定義吃飯這個動作了,有人可能會說我們可以在定義一個RotboDining()方法,其實大可不必!我們只需改造一下Robot和Peoplo類就可以了,如下所示
1public class Peoplo
2{
3 public int stature { get; set; }//身高
4 public int avoirdupois { get; set; }//體重
5 public Peoplo()
6 {
7 //
8 //TODO: 在此處添加構造函數邏輯
9 //
10 }
11 public virtual string dining()//吃飯
12 {
13 return "今天的紅燒肉真好吃!";
14 }
15 public string dreamland()//睡覺
16 {
17 return "為什麼不是席夢思的床墊呢?";
18 }
19}
改造後的Peoplo和原來的沒什麼大的變化,只不過是dining()多了一個virtual關鍵字,它的作用是什麼呢?稍後你就知道了。再來看一下改造後的Robot類,如下所示。
我們發現改造後的Robot類中多了一個public override string dining()方法,這個方法與基類Peoplo中的dinind()方法簽名一模一樣,而且前面還有一個關鍵字override,先別著急我們先來運行下Default.aspx頁面看下運行結果,結果如下:
別讓俺干活,俺在充電中!
怎麼樣現在Robot的dining()符合機器人的充電實際效果了吧。他是怎麼實現的呢?
我們先來看下Robot的public override string dining(),這個方法與基類Peoplo中的dinind()方法簽名一模一樣,而且前面還有一個關鍵字override,這用聲明方法的作用是重寫基類中的dining()方法,這個聲明關鍵就在於關鍵字override,他表示我要重寫基類中的一個方法,那麼要重寫基類的哪個方法呢,這時候方法名dining()就派上用場了,他表示要重寫基類的哪個方法,注意這個方法名一定要和基類中的方法簽名一模一樣(不光是方法名一樣,參數的類型,數量,順序要必須一致),如果這個方法簽名與基類中被重寫的方法簽名不一致會發生錯誤。
那麼是不是在派生類中能夠將基類中的方法全部都能夠重寫呢,未必!這還要看看基類中的方法是不是可以被重寫,怎麼識別或設置基類中的方法能被重