摘要:物件導向系列菜單4-『物件導向特性-繼承(Inheritance)3-Sealed』
官爺:陳夢吉!
陳夢吉: 我的名字是給你叫的嗎?
官爺:老子有大筆的財產~但老子我就是不想給任何人繼承~! 要如何做呢?
陳夢吉 : 你有聽過『sealed』嗎?,憑你的智慧,我很難跟你解釋!
正文開始
本文主要討論主題為
1.『類別不給繼承要這麼做呢?』
2.『已覆寫完的方法不給衍生類別再覆寫要這麼做呢?』
『類別不給繼承要這麼做呢?』
Step1. 使用『Sealed』
下列為簡單的Sealed範例。
Car類別程式說明:
父類別Class Car ,有兩個屬性分別為Speed與Color,
並自行訂定建構子Car() ,以及DriveCar()方法,在這
範例中我們將Car類別,新增『Sealed』修飾詞,主要
目的為不然其它類別繼承。
///
/// 父類別
///
public sealed class Car //增加Sealed
{
//車子的速度
public string Speed;
//車子的顏色
public string Color;
///
/// 定義建構子,預設Speed為50,Color為Blue
///
public Car()
{
Speed = "50";
Color = "Blue";
}
//定義車子移動的方法
public string DriveCar()
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" ;
}
}
BMWCar類別程式說明
子類別BMWCar Class 繼承父類別Car,並有自行定義建構子BMWCar() ,
以及BMWPower屬性。由於父類別Car有加Sealed因此無法被繼承。依下列
程式碼,會找不到父類別的Speed與Color,而出現錯誤訊息。
///
/// 子類別想繼承Car Class,但因為Car有加Sealed因此無法被繼承。
///
public class BMWCar :Car
{
//BMWCar類別建構子
public BMWCar()
{
Speed = "BMW500";
Color = "BWM_Red";
}
//BMW的屬性引擎
public string BMWPower;
}
『已覆寫完的方法不給衍生類別再覆寫要這麼做呢?』
有時在使用時,我們不想讓已經覆寫過的方法要著麼做呢?
下列程式碼,有三個類別Car、BMWCar、IBMWCar。
繼承關於為
Car → BMWCar → IBMWCar
//父類別
public class Car
{
//定義車子移動的方法。
//在該方法加上Virtual,讓該方法可以被衍生類別覆寫。
public virtual string DriveCar( string a)
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" ;
}
}
要讓BWMCar已覆寫過的DriveCar()不被IBMWCa覆寫,要在
DriveCar前加上『sealed』修飾詞。
//BMWCar繼承Car Class
public class BMWCar: Car
{
//定義車子移動的方法
//使用存取修飾詞Overried,來進行覆寫
//參數a 為 string
public sealed override string DriveCar(string a)
{
return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" + "『Override』" + "String--" + a;
}
}
//測試可不覆寫DriveCar();
//IBMWCar 繼承 BMWCar
public class IBMWCar : BMWCar
{
public override string DriveCar( string a)
{
return "ICar" ;
}
}
這時就會發生下列錯誤,告知該方法無法在被覆寫。
待續…
參考資料