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

繼承為物件導向的三大特性之一(封裝、多型),你可以想像老爸與兒子的關係,兒子會繼承老爸所擁有的特徵(屬性)和)財產(方法)(現實上不一定,但請官爺們想簡單點),兒子可能會有老爸的大鼻子或小嘴巴,並且可以開著老爸的車(財產)出去玩,這就是繼承。

繼承父類別(基底類別 Base Class)的類別就被稱為子類別(衍生類別 Derived Class),子類別繼承了父類別的屬性與方法。

繼承的傳遞 : 你也會繼承到你阿公的東西

繼承是可以傳遞,Class C 繼承至 Class B,而 Class B 繼承至 Class A,則 Class C 會繼承至 Class A、B 白話文就是,你也會繼承到你阿公的東西。

	
  	/// <summary>
    /// 父類別
    /// </summary>
    public class Car
    {

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


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

    }

    /// <summary>
    /// 子類別繼承Car
    /// </summary>
    public class BMWCar :Car
    {
        //BMW的屬性引擎
        public string BMWPower;

    }

以下紅色框框的部份就是從父類別Car繼承而來的屬性與方法

未命名.png

Equals、GetHashCode、GetType、ToString,就是剛剛提到的繼承會傳遞,以上幾個方法都是繼承至阿公(給人容易理解的名詞)類別Object,如下,在C#中只要是物件都會 繼承Object類別。

	  // 摘要:
    //     支援 .NET Framework 類別階層架構中的所有類別,提供衍生類別的低階服務。 這是 .NET Framework 中所有類別的超基底類別,是型別階層架構的根。
    [Serializable]
    [ClassInterface( ClassInterfaceType.AutoDual)]
    [ComVisible( true)]
    public class Object
    {
        // 摘要:
        //     初始化 System.Object 類別的新執行個體。
        [ ReliabilityContract(Consistency .WillNotCorruptState, Cer.MayFail)]
        public Object();

        // 摘要:
        //     判斷指定的 System.Object 和目前的 System.Object 是否相等。
        //
        // 參數:
        //   obj:
        //     要與目前物件比較的物件。
        //
        // 傳回:
        //     如果指定的物件等於目前的物件,則為 true,否則為 false。
        [ TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries" )]
        public virtual bool Equals( object obj);
        //
        // 摘要:
        //     判斷指定的物件執行個體是否視為相等。
        //
        // 參數:
        //   objA:
        //     要比較的第一個物件。
        //
        //   objB:
        //     要比較的第二個物件。
        //
        // 傳回:
        //     如果物件被視為相等則為 true,否則為 false。 如果 objA 和 objB 都是 null,則這個方法會傳回 true。
        [ TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries" )]
        public static bool Equals( object objA, object objB);
        //
        // 摘要:
        //     做為特定型別的雜湊函式。
        //
        // 傳回:
        //     目前 System.Object 的雜湊程式碼。
        [ TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries" )]
        public virtual int GetHashCode();
        //
        // 摘要:
        //     取得目前執行個體的 System.Type。
        //
        // 傳回:
        //     目前執行個體的確實執行階段型別。
        [ SecuritySafeCritical]
        public Type GetType();
        //
        // 摘要:
        //     建立目前 System.Object 的淺層複本 (Shallow Copy)。
        //
        // 傳回:
        //     目前 System.Object 的淺層複本。
        [ SecuritySafeCritical]
        protected object MemberwiseClone();
        //
        // 摘要:
        //     判斷指定的 System.Object 執行個體是否為相同的執行個體。
        //
        // 參數:
        //   objA:
        //     要比較的第一個物件。
        //
        //   objB:
        //     要比較的第二個物件。
        //
        // 傳回:
        //     如果 objA 與 objB 為相同的執行個體或兩者皆為 null 參考,則為 true,否則為 false。
        [ ReliabilityContract(Consistency .WillNotCorruptState, Cer.Success)]
        [ TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries" )]
        public static bool ReferenceEquals( object objA, object objB);
        //
        // 摘要:
        //     傳回表示目前物件的字串。
        //
        // 傳回:
        //     表示目前物件的字串。
        public virtual string ToString();
    }

繼承特性

#繼承特性

繼承它有一些特性(在C#中)

  • 一個子類別只能繼承一個父類別 (C++可以繼承多類別)
  • 子類別一定會呼叫父類別的建構子
		BMWCar MyBMWCar = new BMWCar ();
		TextBox1.Text = MyBMWCar.DriveCar();
		()
		
		
		Blue50
		()

但這時如果子類別有有一個建構子會著麼樣呢 ??

先自訂子類別建構子如下,然後在執行,會發現結果為會先執行父類別建構子再執行子類別建構子

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

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

    }
    
    
    BMW_redBMW500
    ()

參考資料

comments powered by Disqus