C#基礎知識-面向對象思想之繼承(八)
上一篇的標題編程思想我覺得不是很符合主題,因為編程思想的範圍太大了,不僅僅是封裝 繼承 多態,所以比較符合主題的應該是面向對象思想。這一篇中將繼續敘述面向對象思想中的繼承。
從字面來看繼承表達的意思已經很清楚了,我們看電視劇就經常有一個富二代老頭去世或者退位,就由兒女繼承他的家產,一個黑幫老大倒下,由他最得力的小弟繼位,這些都是繼承,現實世界中的繼承是過繼,是將老爸(父類)的財產或權利過繼給兒女,過繼完後老爸(父類)將不再擁有這些東西,而程序中的繼承並不是將父類的東西過繼給子類,更多的像是一中基因的遺傳,老爸(父類)有的屬性和行為,你都可以完全的擁有,並且老爸(父類)中的這些行為和屬性仍然還在,並不會因為繼承而消失,如下圖:
在程序中的繼承和現實世界中的繼承是不一樣的,子類繼承於父類後,父類仍然擁有這些屬性和行為。
繼承的基本概念:
? C#中只支持單繼承,但運行實現多個接口,支持多接口繼承(接口將會在下一章說明)。
? 當子類繼承與父類則自動擁有父類中所有的成員(私有除外)。
? 密封類、結構類不可繼承。
下面來看一段簡單的代碼:
首先創建一個動物父類
1 public class Animal 2 { 3 //名稱 4 private string Name; 5 6 //呼吸方法 7 public void breathing() 8 { 9 Console.WriteLine(Name + "在呼吸..."); 10 } 11 12 //進食 13 public void eating() 14 { 15 Console.WriteLine(Name + "在進食..."); 16 } 17 18 //使用構造函數初始化名稱 19 public Animal(string Name) 20 { 21 this.Name = Name; 22 } 23 } 24 25 再創建一個人類(子類),繼承使用 類名 :父類名 的格式 26 //人類是動物的一種 27 public class Person : Animal 28 { 29 //使用構造函數初始化父類動物的名稱 30 public Person(stringName) : base(Name) 31 { } 32 } 33 34 通過子類調用父類的方法: 35 class Program 36 { 37 static void Main(string[] args) 38 { 39 //實例化一個Person類,並且在構造函數中傳入一個參數 40 Person person = new Person("人類"); 41 //調用父類呼吸方法 42 person.breathing(); 43 //調用子類進食方法 44 person.eating(); 45 Console.ReadKey(); 46 } 47 }
通過這裏可以看到子類並沒有創建 breathing 和 eating方法,但是可以在實例中直接的調用,這就是自動的擁有的父類的行為。
到這裏再思考一下,如果父類中的方法我們並不滿意想要用自己的方法去代替父類,那麽在父類中的方法就要聲明虛方法(virtual),可以在子類中重寫(override)父類的函數
虛方法(virtual)的使用:
比如在Animal類中想要派生一個子蛇類Snake,蛇在冬天的時候會冬眠一段時間所以不需要進食,那麽只需要在Animal類中添加一個virtual關鍵字,代表是虛方法,可以直接拿來用也可以根據子類的需要重寫它:
public class Animal { //名稱 private string Name; //呼吸方法 public void breathing() { Console.WriteLine(Name + "在呼吸..."); } //進食添加一個虛函數子類可以重寫它 public virtual void eating() { Console.WriteLine(Name + "在進食..."); } //使用構造函數初始化名稱 public Animal(string Name) { this.Name = Name; } } //子類中使用重寫(override) public class Snake : Animal { public Snake(string name) : base(name) { } //重寫父類方法 public override void eating() { Console.WriteLine("現在是冬天不需要進食!"); }
} 當然我們也可以直接覆蓋掉父類的方法,這裏註意重寫和覆蓋的作用是不同的。 public class Snake : Animal { public Snake(string name) : base(name) {
} //直接在函數前面使用new覆蓋父類方法 new public void eating() { Console.WriteLine("現在是冬天不需要進食!"); } }
小結一下,這篇文章中我們介紹了繼承的基本概念,還有使用了簡單的代碼來演示繼承在程序中的表達方式,其實要深入的話還有很多的作用,但是篇幅有限,這裏我指介紹最基本的用法,如果有遇到問題的朋友也可以直接發微信給我。
C#基礎知識-面向對象思想之繼承(八)