物件導向系列菜單 4 -『 物件導向特性-繼承(Inheritance) 3 - Sealed 』
c井字號 物件導向
Lastmod: 2019-12-11

特點 1 - 使用 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;

    }

特點 2 - 已覆寫完的方法不給衍生類別再覆寫

有時在使用時,我們不想讓已經覆寫過的方法要著麼做呢 ? 下列程式碼,有三個類別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" ;
        }
    }

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

參考資料

comments powered by Disqus