構造函數
- 構造函數就是一個對象的初始操作的函數,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 返回值類型 函數名(參數列表)
- 重寫後,⼦類的對象,⽆論是不是轉換成了⽗類的類型,都會執⾏重寫後的該函數