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

摘要:物件導向系列菜單2-『物件導向特性-繼承(Inheritance)1』

官爺的下人曰 : 小二 ~ 物件導向有三個主要的特性分為
『繼承(Inheritance)』、『多型(Polymorphism)』、『封裝(Encapsulation)』
官爺的下人曰 : 可否給我們家官爺說說何謂『繼承』??
店小二曰 : 繼承…就…是繼承…小的不是很清楚…
官爺的曰 : 怒! 回家種田去吧~
店小二曰 : ……OS(可是我家沒田啊)

 

物件導向特性之一繼承,曾幾何時,小的我也曾經被問過
但總是如上文店小二,支支烏烏的答不上來而被羞辱~
因此來寫寫這篇文章好好理解一下『繼承』的概念~
讓小弟從周星馳電影的台詞由上轉至下。
 
『憑你的智慧,我很難跟你解釋!』
     ↓
『憑你的智慧,我唬得了你嗎?』

 

正文開始:

何謂繼承 ?

陳夢吉: 你有沒有老爸
小二 : 有啊!
陳夢吉 : 那你會不會繼承你老爸有的東西 ?
小二 : 當然!我繼承了老爸的小眼睛、大嘴巴,但就是…缺田…。
陳夢吉 : 慘~~~~~~不過這就是『繼承』囉~

 

繼承為物件導向的三大特性之一,你可以想像老爸與兒子的關係,
兒子會繼承老爸所擁有的特徵(屬性)和)財產(方法)(現實上不一定,但請官爺們想簡單點),
兒子可能會有老爸的大鼻子或小嘴巴,並且可以開著老爸的車(財產)出去玩,這就是繼承。
 
繼承父類別(基底類別 Base Class)的類別就被稱為子類別(衍生類別 Derived Class)
子類別繼承了父類別的屬性與方法。
 
注意1:
繼承是可以傳遞,Class C繼承至Class B,而Class B繼承至Class A,則Class C會繼承至Class A、B
白話文就是,你也會繼承到你阿公的東西。
繼承是可以傳遞,Class A為ClassB的父類別,而Class B 為 Class C的父類別,則Class C會繼承Class A與B
白話文就是,你也會繼承到你阿公的東西。
以下為繼承程式碼
  /// 
    /// 父類別
    /// 
    public class Car
    {

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


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

    }

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

    }

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

 

注意2:
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#中)
1.一個子類別只能繼承一個父類別 (C++可以繼承多類別)
2.子類別一定會呼叫父類別的建構子
 
//實體化BMWCar類別,同時自動呼叫父類別Car之建構子
BMWCar MyBMWCar = new BMWCar ();
  TextBox1.Text = MyBMWCar.DriveCar();

(看看上面父類別的程式碼)

 
執行結果
 
注意3:
但這時如果子類別有有一個建構子會著麼樣呢??
自訂子類別建構子程式碼
/// 
    /// 子類別繼承Car
    /// 
    public class BMWCar : Car
    {
        //BMWCar類別建構子
        public BMWCar()
        {
            Speed = "BMW500" ;
            Color = "BWM_Red" ;
        }

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

    }
執行結果
 

 

 



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

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