物件導向系列菜單3-『物件導向特性-繼承(Inheritance)2-Override』

摘要:物件導向系列菜單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修飾詞為需要用來修改或擴充父類別的方法、屬性,則需要給予
該方法或屬性進行宣告。

// 子類別繼承Car
    public class BMWCar :Car
    {
        //BMWCar類別建構子
        public BMWCar()
        {
            Speed = "BMW500";
            Color = "BWM_Red";
        }

        //BMW的屬性引擎
        public string BMWPower;

        //定義車子移動的方法
        //使用存取修飾詞Overried,來進行覆寫
        public override string DriveCar()
        {
            return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" + "『Override』" ;
        }

    }
執行結果

 

注意1
你不能覆寫『非虛擬』或『靜態方法』。被覆寫的父類別方法必須是『Virtual』、『abstract』、『Override』
 
注意2
override 方法和 virtual 方法都必須有相同的存取層級修飾詞

//定義車子移動的方法。
       //在該方法加上Virtual,讓子類別可以覆寫該方法。
        public virtual string DriveCar()
        {
            return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" ;
        }

       //定義車子移動的方法
        //使用存取修飾詞Overried,來進行覆寫
        protected  override string DriveCar()
        {
            return "正在開『" + Color + "』的車" + "時速『" + Speed + "』在移動" + "『Override』" ;
        }
如果將BMWCar類別程式碼其的DriveCar()從public改成 protected 則會出錯。
 
注意3:
如果是覆寫『屬性』時,則以下有兩項條件
1.覆寫屬性宣告必須指定和所繼承屬性完全相同的存取修飾詞、型別和名稱
2.且被覆寫的屬性必須是 virtualabstract 或 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) ;
執行結果
而如果實體化並呼叫DriveCar改為

 

 



小弟才書學淺~請各位客官指教指教~~~

小弟日 : 你要知道自已不是帥哥,你才有可能變成帥哥 。