本文向您介紹C#繼承方面的知識,包括初始化基類、重寫、方法重載等。C#的繼承與 C++ 等語言一個重要的不同,就是只能從一個類中繼承,這是開發者在權衡了從多個類C#繼承的優勢與劣勢作出的結果。
C#的繼承與 C++ 等語言一個重要的不同,就是只能從一個類中繼承,這是開發者在權衡了從多個類C#繼承的優勢與劣勢作出的結果。不過,可以從接口繼承。另外,繼承可傳遞。構造函數和析構函數不能被繼承。
初始化基類
可以在派生類構造函數中添加初始化基類的代碼。
- public class BaseClass
- {
- private int i = 0;
- public BaseClass(int index)
- {
- i = index;
- }
- }
- public class DerivedClass : BaseClass
- {
- private int j = 0;
- public DerivedClass(int index) : base(index)
- {
- j = index;
- }
- }
注意派生類構造函數中的 : base(index)。將先調用基類的構造函數。
另外,相對於 this,要訪問基類的成員,可以使用 base,當前這不能用在靜態方法中,因為靜態方法沒有實例。
C#繼承中的重寫
◆virtual 用在基類中,指定一個虛方法(屬性),表示這個方法(屬性)可以重寫。
◆override 用在派生類中,表示對基類虛方法(屬性)的重寫。
以上的基類和派生類都是相對的。B 是 C 的基類,也可以是 A 的派生類,B 中既可以對 A 中的 virtual 虛方法用 override 重寫,也可以指定 virtual 虛方法供 C 重寫。
不能重寫非虛方法或靜態方法。重寫的基方法必須是 virtual、abstract 或 override 的。為什么 override 也可以重寫呢?因為基類中的 override 實際上是對基類的基類進行的重寫,由於繼承可傳遞,所以也可以對基類中 override 的方法進行重寫。
◆override 聲明不能更改 virtual 方法的可訪問性。override 方法和 virtual 方法必須具有相同的訪問級別修飾符。
不能使用修飾符 new、static、virtual 或 abstract 來修改 override 方法。
◆重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,並且被重寫的屬性必須是 virtual、abstract 或 override 的。
- public class BaseClass
- {
- public virtual string GetString()
- {
- return "這是一個虛方法。";
- }
- }
- public class DerivedClass : BaseClass
- {
- public override string GetString()
- {
- return "這是重寫了的方法。";
- }
- }
可以看出,重寫與前面講的重載是有區別的。
C#繼承中的方法重載
方法重載並不是類繼承中的內容,只是它容易和重寫等混淆,所以放在一起談談。
什么是重載呢,舉個例子,我們在應用 System.IO.File.Create() 方法時,往往可以選擇幾種參數,這是就方法的重載,同一個作用域、同一個方法名稱、具有不同的參數類型或參數個數,在調用方法時,根據參數自動決定使用哪一個方法。
示例
- public string GetString()
- {
- //...
- }
- public string GetString(int index)
- {
- //...
- }
- public string GetString(string userName)
- {
- //...
- }
在C#中,方法參數沒有默認值,可通過重載來實現默認值功能。