almost 3 years ago

使用Sealed關鍵字使類別不能被繼承

下列為簡單的Sealed範例。

父類別Class Car ,有兩個屬性分別為SpeedColor,並自行訂定建構子Car() ,以及DriveCar()方法,在這範例中我們將Car類別,新增Sealed修飾詞,主要目的為不然其它類別繼承。

/// <summary>
/// 父類別
/// </summary>
public sealed  class Car   //增加Sealed
{

    //車子的速度
    public string Speed;
    //車子的顏色
    public string Color;  
    /// <summary>
    /// 定義建構子,預設Speed為50,Color為Blue
    /// </summary>
    public  Car()
    {
        Speed = "50";
        Color = "Blue";
    }

    //定義車子移動的方法
    public string DriveCar()
    {
        return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" ;
    }

}

子類別BMWCar 繼承父類別Car,並有自行定義建構子BMWCar() ,以及BMWPower屬性。由於父類別Car有加Sealed因此無法被繼承。依下列程式碼,會找不到父類別的Speed與Color,而出現錯誤訊息。

/// <summary>
/// 子類別想繼承Car Class,但因為Car有加Sealed因此無法被繼承。
/// </summary>
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" ;
    }
}

這時就會發生下列錯誤,告知該方法無法在被覆寫。

參考資料

← 物件導向系列菜單3-『物件導向特性-繼承(Inheritance)2-Virtual與Override』 物件導向系列菜單5-『物件導向特性-繼承(Inheritance)4-abstract』 →
 
comments powered by Disqus