今天和大家探討C#中面向對象的特性之二---繼承
何為繼承?簡單的一句話就是:建立類之間的關系,實現代碼的重用性,方便系統擴展。說白了就是兩個關鍵點:a.避免代碼的冗余,b.進行程序擴展。
接下來我們進行更進一步的了解繼承,繼承是面向對象程序設計的主要特征之一,它可以讓使代碼的重用性大大加強,可以節省程序設計的時間。繼承就是在類之間建立一種相交關系,使得新定義的派生類的實例可以繼承已有的基類的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起類的新層次,比如子類(派生類)可以繼承父類(基類) 某些成員,繼承和類的成員方法一樣,我們也可以定義屬性的重載、虛屬性、抽象屬性以及密封屬性的概念。繼承的兩大特性是傳遞性和單根性。
在生活中我們也實現了繼承比如:
我們還是先來看個簡單的例子:
創建父類:
1 class Dog
2 {
3 string type;//類型
4 public string Type
5 {
6 get { return type; }
7 set { type = value; }
8 }
9 int weight;//體重
10 public int Weight
11 {
12 get { return weight; }
13 set { weight = value; }
14 }
15 int height;//高度
16 public int Height
17 {
18 get { return height; }
19 set { height = value; }
20 }
21 public Dog() { }//無參數的構造方法
22 public Dog(string t, int w, int h)//帶參數的構造方法
23 {
24 this.type = t;
25 this.weight = w;
26 this.height = h;
27 }
28 }
添加Dog的子類
1 class Collie : Dog//子類
2 {
3 public Collie()//無參數的構造方法
4 {
5 this.Type = "柯利犬";
6 this.Weight = 34;
7 this.Height = 66;
8 }
9 public void Act()//方法輸出柯利犬的特點
10 {
11 Console.WriteLine("性格:溫和,活潑,忠實,親切");
12 }
13 }
14 class SheltlandSheepdog : Dog//子類
15 {
16 public SheltlandSheepdog()//無參數的構造方法
17 {
18 this.Type = "喜樂蒂";
19 this.Weight = 18;
20 this.Height = 30;
21 }
22 public void Act()//方法輸出喜樂蒂的特點
23 {
24 Console.WriteLine("性格:溫和而忠實,聰明的犬種");
25 }
26 }
在Main方法中實例化子類對象並調用它們的方法:
1 static void Main(string[] args)
2 {
3 Console.WriteLine("柯利犬的特點");
4 Collie collie = new Collie();
5 collie.Act();//調用方法www.2cto.com
6 Console.WriteLine("喜樂蒂的特點");
7 SheltlandSheepdog sheltlandsheepdog = new SheltlandSheepdog();
8 sheltlandsheepdog.Act();//調用方法
9 Console.ReadKey();
10 }
運行結果:
base關鍵字
在繼承中base關鍵字是專門用來繼承父類的。在我們運用的時候一般是在重寫、覆蓋還有構造函數裡面來調用父類裡面的這個方法時用:base(),這個base好像和JAVA裡面的super相似(本人是搞.net的,對JAVA不是很了解)。C#裡面和base差不多的還有一個就是this了!其實這兩個用起來也很相似,不過還是有區別的,this是指向本身,base是指向父類。就比如說:你在父類裡面int n;你在子類裡面也int n; 那麼此時base.n和this.n表示的就不是同一個變量了,但是如果子類裡面沒有定義n,那麼base.n和this.n就是同一個變量了。
結合上例base 在帶參數的構造方法中的使用
public qingpingguo(string t,int w,int h):base(t,w,h){}
我們繼續看一下繼承的傳遞性
派生類是從基類那裡繼承特性,那麼派生類也可以作為其它類的基類。從一個基類派生出來多層類,這樣就形成了類層次結構。就好比汽車為基類,然後汽車又分為卡車和公共汽車,那麼卡車和公共汽車就是派生類,卡車又可以作為基類派生出小型卡車和重型卡車。簡單的說就是子類不僅僅能夠繼承父類的成員,還繼承了父類的父類的成員。我們來看一張圖就會明白了:
繼承的單根性
繼承的單根性是指子類只能繼承一個父類,不能同時繼承多個父類。就好比兒子只能有一個父親(親生的),派生類只能從一個類中繼承,繼承不支持多重繼承。這樣規定是為了避免代碼結構的復雜性。
最後介紹兩個屬性:
一個是抽象屬性
使用abstract 修飾符聲明的屬性為抽象屬性。
抽象屬性的訪問器也是虛的,而且沒有提供訪問器的具體實現。這就要求在非虛的派生類中,由派生類自己通過重載屬性來提供對訪問器的具體實現。
abstract 和override 修飾符的同時使用,不但表示屬性是抽象的,而且它重載了基類中的虛屬性這時屬性的訪問器也是抽象的。
抽象屬性只允許在抽象類中聲明。
除了同時使用abstract 和override 修飾符這種情況之外,static, virtual, override和abstract 修飾符中任意兩個不能再同時出現。
密封屬性
使用sealed 修飾符聲明的屬性為密封屬性。類的密封屬性不允許在派生類中被繼承。密封屬性的訪問器同樣也是密封的。
屬性聲明時如果有sealed 修飾符,同時也必須要有override 修飾符。
總結:
1.了解繼承;
2.base關鍵字;
3.繼承的傳遞性;
4.繼承的單根性;
好啦!今天就到這了!我眼睛都快睜不開了!感覺寫的有點倉促,因為有好多東西沒有寫到!不過還是希望能夠對初學者有一些幫助!如果對初學者有點用的話,我覺得今天晚上就沒有白費功夫!
此文是本人的個人觀點,如有不完善或者不准確的地方,歡迎高手進行批評,老鳥進行指點。