1. 程式人生 > >C#基礎知識-面向對象思想之繼承(八)

C#基礎知識-面向對象思想之繼承(八)

添加 電視劇 一中 一段 public bsp 更多 cnblogs tin

上一篇的標題編程思想我覺得不是很符合主題,因為編程思想的範圍太大了,不僅僅是封裝 繼承 多態,所以比較符合主題的應該是面向對象思想。這一篇中將繼續敘述面向對象思想中的繼承。

從字面來看繼承表達的意思已經很清楚了,我們看電視劇就經常有一個富二代老頭去世或者退位,就由兒女繼承他的家產,一個黑幫老大倒下,由他最得力的小弟繼位,這些都是繼承,現實世界中的繼承是過繼,是將老爸(父類)的財產或權利過繼給兒女,過繼完後老爸(父類)將不再擁有這些東西,而程序中的繼承並不是將父類的東西過繼給子類,更多的像是一中基因的遺傳,老爸(父類)有的屬性和行為,你都可以完全的擁有,並且老爸(父類)中的這些行為和屬性仍然還在,並不會因為繼承而消失,如下圖:
技術分享


在程序中的繼承和現實世界中的繼承是不一樣的,子類繼承於父類後,父類仍然擁有這些屬性和行為。

繼承的基本概念:
? 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(string
Name) : 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#基礎知識-面向對象思想之繼承(八)