什麼是繼承? 繼承是將兩個類中相同的屬性及方法抽取出來,放到一個新的類中(父類),而這兩個子類依然擁有這些屬性和方法。抽象點的 說,每輛車子都能跑(擁有跑的方法),都有輪胎(有輪胎這個屬性)。 使用繼承編程的好處? 使用繼承編程可以大大的減少代碼冗餘,增加代碼復用。 如何使用繼承? 以第一問為例做延 ...
什麼是繼承?
繼承是將兩個類中相同的屬性及方法抽取出來,放到一個新的類中(父類),而這兩個子類依然擁有這些屬性和方法。抽象點的
說,每輛車子都能跑(擁有跑的方法),都有輪胎(有輪胎這個屬性)。
使用繼承編程的好處?
使用繼承編程可以大大的減少代碼冗餘,增加代碼復用。
如何使用繼承?
以第一問為例做延伸:假若我們現在需要兩個類,一個貨車類,一個轎車類。代碼如下
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> 2 /// 貨車類 3 /// </summary> 4 class Truck 5 { 6 //時速 7 public int Speed { get; set; } 8 //顏色 9 public string Colour { get; set; } 10 //購買價格 11 public double Price { get; set; } 12 13 /// <summary> 14 /// 貨運方法 15 /// </summary> 16 public void Cargo() 17 { 18 Console.WriteLine("運輸貨物"); 19 } 20 } 21 22 /// <summary> 23 /// 轎車類 24 /// </summary> 25 class Sedan 26 { 27 //時速 28 public int Speed { get; set; } 29 //顏色 30 public string Colour { get; set; } 31 //購買價格 32 public double Price { get; set; } 33 34 /// <summary> 35 /// 載客方法 36 /// </summary> 37 public void CarryPassengers() 38 { 39 Console.WriteLine("載客"); 40 } 41 }示例 : 未使用繼承
通過這段代碼不難發現,貨車類和轎車類擁有三個相同的屬性,一個不同的方法。根據繼承的特性,需要把相同的屬性或方法抽
取出來。代碼如下
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> 2 /// 車輛類 父類 3 /// </summary> 4 class Vehicle 5 { 6 //時速 7 public int Speed { get; set; } 8 //顏色 9 public string Colour { get; set; } 10 //購買價格 11 public double Price { get; set; } 12 } 13 14 /// <summary> 15 /// 貨車類 繼承車輛類 16 /// </summary> 17 class Truck : Vehicle 18 { 19 /// <summary> 20 /// 貨運方法 21 /// </summary> 22 public void Cargo() 23 { 24 Console.WriteLine("運輸貨物"); 25 } 26 } 27 28 /// <summary> 29 /// 轎車類 繼承車輛類 30 /// </summary> 31 class Sedan : Vehicle 32 { 33 /// <summary> 34 /// 載客方法 35 /// </summary> 36 public void CarryPassengers() 37 { 38 Console.WriteLine("載客"); 39 } 40 }示例 : 使用繼承
那麼問題又來了,繼承的特性-代碼復用體現在哪裡呢?下麵我們簡單地瞭解一下。
在第一段代碼中,有兩個類,如果我們想在創建對象時使用帶參構造函數來初始化屬性的話,要在兩個類中都寫上相同的一段代
碼。(構造函數詳解)
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 貨車類 3 /// </summary> 4 class Truck 5 { 6 //時速 7 public int Speed { get; set; } 8 //顏色 9 public string Colour { get; set; } 10 //購買價格 11 public double Price { get; set; } 12 public Truck(int speed, string colour, double price) 13 { 14 this.Speed = speed; 15 this.Colour = colour; 16 this.Price = price; 17 } 18 ... 19 } 20 21 /// <summary> 22 /// 轎車類 23 /// </summary> 24 class Sedan 25 { 26 //時速 27 public int Speed { get; set; } 28 //顏色 29 public string Colour { get; set; } 30 //購買價格 31 public double Price { get; set; } 32 public Truck(int speed, string colour, double price) 33 { 34 ... 35 } 36 ... 37 }示例 : 冗餘的代碼
顯而易見,上面的重覆代碼很多。下麵我們使用繼承來簡化一下上面的代碼。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 車輛類 父類 3 /// </summary> 4 class Vehicle 5 { 6 //時速 7 public int Speed { get; set; } 8 //顏色 9 public string Colour { get; set; } 10 //購買價格 11 public double Price { get; set; } 12 13 /// <summary> 14 /// 帶參構造函數 15 /// </summary> 16 /// <param name="speed"></param> 17 /// <param name="colour"></param> 18 /// <param name="price"></param> 19 public Vehicle(int speed, string colour, double price) 20 { 21 this.Speed = speed; 22 this.Colour = colour; 23 this.Price = price; 24 } 25 } 26 27 /// <summary> 28 /// 貨車類 繼承車輛類 29 /// </summary> 30 class Truck : Vehicle 31 { 32 /// <summary> 33 /// 子類使用父類構造函數 34 /// </summary> 35 public Truck(int speed, string colour, double price) : 36 base (speed,colour,price) 37 { 38 39 } 40 ... 41 } 42 43 /// <summary> 44 /// 轎車類 繼承車輛類 45 /// </summary> 46 class Sedan : Vehicle 47 { 48 /// <summary> 49 /// 子類使用父類構造函數 50 /// </summary> 51 public Sedan(int speed, string colour, double price) : 52 base (speed,colour,price) 53 { 54 55 } 56 ... 57 }示例 : 簡化的代碼
使用了繼承之後,即使再多的派生類需要帶參構造函數,也不怕了,只要一行代碼即可完成。
Base關鍵字:
base關鍵字表示父類,可以用於訪問父類的成員。例:base.父類成員。
除了上面通過base顯示的調用父類帶參構造函數外,創建子類對象時還會隱式的調用父類的無參構造函數。(創建子類對象時
會先調用父類的無參構造函數。)
進一步瞭解和使用繼承
繼承的特性:
1.傳遞性:繼承可以無限的向下派生,但是需要符合一個條件:子類可以出現在父類出現的地方並替換父類,即子類
擁有父類的全部特征和能夠實現父類的全部方法。
2.單根性:一個子類只能繼承自一個父類。不存在一個子類同時繼承自兩個或多個父類的情況。
is a關鍵字:
這個關鍵字用來判斷對象是否屬於給定的類型。返回值為bool類型。
例:
if (Vehicle is Truck)
{
...
}
sealed關鍵字:
用這個關鍵字修飾的類是不能被繼承的,即密封類。常用的string類就是密封類。本文只做瞭解,後更示例。
至此,關於繼承已經講得差不多了,下麵是本文用到的所有代碼,希望可以幫到看到此處的你。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Demo demo = new Demo(); 6 demo.Test(); 7 8 Console.Read(); 9 } 10 } 11 12 class Demo 13 { 14 List<Vehicle> vehicles = new List<Vehicle>(); 15 16 public void Test() 17 { 18 vehicles.Add(new Truck(50, "藍色", 150000)); 19 vehicles.Add(new Sedan(80, "黑色", 210000)); 20 foreach (Vehicle item in vehicles) 21 { 22 if (item is Truck) 23 { 24 Console.WriteLine("我是貨車,時速{0},我是{1}的,價格{2}元。", item.Speed, item.Colour, item.Price); 25 ((Truck)item).Cargo(); 26 } 27 if (item is Sedan) 28 { 29 Console.WriteLine("我是轎車,時速{0},我是{1}的,價格{2}元。",item.Speed,item.Colour,item.Price); 30 ((Sedan)item).CarryPassengers(); 31 } 32 } 33 } 34 } 35 36 /// <summary> 37 /// 車輛類 父類 38 /// </summary> 39 class Vehicle 40 { 41 //時速 42 public int Speed { get; set; } 43 //顏色 44 public string Colour { get; set; } 45 //購買價格 46 public double Price { get; set; } 47 48 /// <summary> 49 /// 帶參構造函數 50 /// </summary> 51 /// <param name="speed"></param> 52 /// <param name="colour"></param> 53 /// <param name="price"></param> 54 public Vehicle(int speed, string colour, double price) 55 { 56 this.Speed = speed; 57 this.Colour = colour; 58 this.Price = price; 59 } 60 } 61 62 /// <summary> 63 /// 貨車類 繼承車輛類 64 /// </summary> 65 class Truck : Vehicle 66 { 67 /// <summary> 68 /// 子類使用父類構造函數 69 /// </summary> 70 public Truck(int speed, string colour, double price) : 71 base (speed,colour,price) 72 { 73 74 } 75 76 /// <summary> 77 /// 貨運方法 78 /// </summary> 79 public void Cargo() 80 { 81 Console.WriteLine("我能運輸貨物"); 82 } 83 } 84 85 /// <summary> 86 /// 轎車類 繼承車輛類 87 /// </summary> 88 class Sedan : Vehicle 89 { 90 /// <summary> 91 /// 子類使用父類構造函數 92 /// </summary> 93 public Sedan(int speed, string colour, double price) : 94 base (speed,colour,price) 95 { 96 97 } 98 /// <summary> 99 /// 載客方法 100 /// </summary> 101 public void CarryPassengers() 102 { 103 Console.WriteLine("我可以載客"); 104 } 105 }完整代碼
結尾語:學到知識不與人分享,猶如衣錦夜行,毫無意義。