C#構造函數、繼承與多態

構造函數

  • 構造函數就是一個對象的初始操作的函數,new對象()的時候調⽤,方法名必須與類一樣,且沒有返回值類型
  • 構造函數⼀般都是public,因爲⼀旦構造函數被設置爲了private,那麼外界就⽆法new這個對象了
  • 如果一個類沒有構造函數,那麼系統會自動寫一個空參數空方法體的構造函數
  • 構造函數是可以重載的,如果想在執行當前構造函數之前,先執行構造函數:當前構造函數(…) : this(傳實參)
  • 示例:
public Person(string name)
{
    this.name = name;
}
public Person(string name,int age):this(name){
    this.age = age;
}

繼承

  • class 類名 : 繼承的類名
  • C#語言只支持單繼承,不支持多繼承,只能繼承一個類
  • 基類:被繼承,但自身沒有繼承別人
  • 子類在實例化的時候,除了調用自己的構造函數,還會調用父類的構造方法,以及父類的父類的構造方法
  • 關於構造函數的執行順序:一個子類對象被實例化的時候,先實例化一個父類的對象(執行父類的構造方法),然後才實例化子類的對象(執行子類的構造方法)
  • public和protected可以被繼承,子類的子類也可以
  • 關於子類的構造函數該如何創建:子類至少要有一個和父類匹配上的構造函數,如果構造函數有參數,則還需要先調用父類的構造函數並傳參數,然後在調用子類的構造,調用方式:public ⼦類名(參數列表) : base(參數列表)
public Person(string name)
{
    this.name = name;
} 
public Programmer(string name, int age,string language) : base(name)
{
    this.language = language;
} 

多態

一、子類對象與父類對象之間的轉換

  • 什麼是多態:同一類對象,做同一件事情,表現出不同的狀態
  • 子類對象轉換爲父類對象:可以隱式轉換
//HeNanPerson繼承Person
Person xiaoming = new HeNanPerson("小明"); 
  • 父類對象轉換爲子類對象:需要強制轉換,有兩種方式
HeNanPerson xiaogang = (HeNanPerson)new Person("小剛"); //(要轉換的類型)對象
HeNanPerson xiaogang = new Person("小剛") as HeNanPerson; //對象 as 要轉換的類型【僅限引⽤類型】
  • 強制轉換可能會轉換失敗,所以強制轉換之前需要先進⾏類型判斷,判斷是否可以轉換成功:對象 is 類型【僅限引⽤類型】
  • 如果轉換失敗,則轉換後的對象爲null
    在這裏插入圖片描述

二、關於⽗類空參數構造函數的調⽤說明

  • ⼦類在實例化的時候,必會調⽤⽗類的構造函數,⼦類在聲明構造函數的時候,要想辦法調⽤⽗類的構造
  • 如果⽗類是空參數的構造函數 : 可以不寫,默認調用,也可寫 base()
  • 如果⽗類是有參數的構造函數,那麼⼀定概要通過base的⽅式調⽤,傳參

三、⼦類⽅法的覆蓋

  • 前提條件:⽗類中有⼀個public函數,⼦類中沒有該函數
  • 在子類中寫同名同形參的函數,此時,⼦類對象調⽤⼦類的該函數,⽗類對象調⽤⽗類的該函數,這種⼦類函數,可以稱之爲覆蓋
  • ⼦類在書寫該函數的時候,規範的寫法應該是:[訪問修飾符] new 返回值類型 函數名(參數列表)
  • 覆蓋:⼦類也有該函數了,以後調⽤的時候就調⽤⼦類的該函數

三、⼦類⽅法的重寫(表現出多態)

  • 如果⽗類想要⼦類可以重寫該函數,該函數必須是虛函數、抽象函數,或者父類中的該函數是重寫的父類的父類中的函數
  • 父類函數應爲:[訪問修飾符] virtual(abstract override) 返回值類型 函數名(參數列表)
  • 子類重寫:[訪問修飾符] override 返回值類型 函數名(參數列表)
  • 重寫後,⼦類的對象,⽆論是不是轉換成了⽗類的類型,都會執⾏重寫後的該函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章