摘要:物件導向系列菜單3-『物件導向特性-繼承(Inheritance)2-Override』
官爺兒子:陳夢吉!
陳夢吉:不要吵我,我正在讀『沙士闢雅』啊!
官爺兒子:我老爸有棟『大房子』~ , 但我不想要那棟,太舊了~著麼辦啊~?
陳夢吉:拆掉重建不就得了~~ (腦袋有洞嗎)
正文開始
本文主要討論主題:
『子類別的方法名稱和父類別的方法名稱一樣,著麼辦呢~?』
『使用Override該注意的地方』
Step1.使用Virtual修飾詞
Virtual 關鍵字的用途是修改方法、屬性或事件宣告,以及允許在衍生類別中給予覆寫。
通常使用的時機是在未來預期該方法可能會被子類別覆寫,則此方法必須宣告Virtual。
//父類別
public class Car
{
//車子的速度
public string Speed;
//車子的顏色
public string Color;
// 定義建構子,預設Speed為50,Color為Blue
public Car()
{
Speed = "50";
Color = "Blue";
}
//定義車子移動的方法。
//在該方法加上Virtual,讓子類別可以覆寫該方法。
public virtual string DriveCar()
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" ;
}
}
Step2 在子類別要覆寫的方法上使用Override修飾詞
Overrride修飾詞為需要用來修改或擴充父類別的方法、屬性,則需要給予
該方法或屬性進行宣告。
注意1
你不能覆寫『非虛擬』或『靜態方法』。被覆寫的父類別方法必須是『Virtual』、『abstract』、『Override』
//定義車子移動的方法。
//在該方法加上Virtual,讓子類別可以覆寫該方法。
public virtual string DriveCar()
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" ;
}
//定義車子移動的方法
//使用存取修飾詞Overried,來進行覆寫
protected override string DriveCar()
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" + "『Override』" ;
}
如果將BMWCar類別程式碼其的DriveCar()從public改成 protected 則會出錯。
注意3:
如果是覆寫『屬性』時,則以下有兩項條件
1.覆寫屬性宣告必須指定和所繼承屬性完全相同的存取修飾詞、型別和名稱。
2.且被覆寫的屬性必須是 virtual、abstract 或 override。
注意4:
如果方法是在類別指定,而在呼叫的類別有兩個方法相容,則C#編譯器會自動呼叫最適合的方法。
我們將BMWCar 類別改為
// 子類別繼承Car
public class BMWCar :Car
{
//BMWCar類別建構子
public BMWCar()
{
Speed = "BMW500";
Color = "BWM_Red";
}
//BMW的屬性引擎
public string BMWPower;
//定義車子移動的方法
//使用存取修飾詞Overried,來進行覆寫
//參數a 為 string
public override string DriveCar( string a)
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" + "『Override』" + "String--" + a;
}
//參數a 為 int
public string DriveCar(int a)
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" + "『Override』" + "Int--" + a ;
}
}
然後實體化並呼叫DriveCar方法。
// int a = 1;
string a = "Hello" ;
BMWCar MyBMWCar = new BMWCar();
TextBox1.Text = MyBMWCar.DriveCar(a) ;
執行結果
int a = 1;
//string a = "Hello";
BMWCar MyBMWCar = new BMWCar();
TextBox1.Text = MyBMWCar.DriveCar(a) ;
則執行結果