摘要:物件導向系列菜單2-『物件導向特性-繼承(Inheritance)1』
官爺的下人曰 : 小二 ~ 物件導向有三個主要的特性分為
『繼承(Inheritance)』、『多型(Polymorphism)』、『封裝(Encapsulation)』
官爺的下人曰 : 可否給我們家官爺說說何謂『繼承』??
店小二曰 : 繼承…就…是繼承…小的不是很清楚…
官爺的曰 : 怒! 回家種田去吧~
店小二曰 : ……OS(可是我家沒田啊)
物件導向特性之一繼承,曾幾何時,小的我也曾經被問過
但總是如上文店小二,支支烏烏的答不上來而被羞辱~
因此來寫寫這篇文章好好理解一下『繼承』的概念~
讓小弟從周星馳電影的台詞由上轉至下。
『憑你的智慧,我很難跟你解釋!』
↓
『憑你的智慧,我唬得了你嗎?』
正文開始:
何謂繼承 ?
陳夢吉: 你有沒有老爸
小二 : 有啊!
陳夢吉 : 那你會不會繼承你老爸有的東西 ?
小二 : 當然!我繼承了老爸的小眼睛、大嘴巴,但就是…缺田…。
陳夢吉 : 慘~~~~~~不過這就是『繼承』囉~
繼承為物件導向的三大特性之一,你可以想像老爸與兒子的關係,
兒子會繼承老爸所擁有的特徵(屬性)和)財產(方法)(現實上不一定,但請官爺們想簡單點),
兒子可能會有老爸的大鼻子或小嘴巴,並且可以開著老爸的車(財產)出去玩,這就是繼承。
繼承父類別(基底類別 Base Class)的類別就被稱為子類別(衍生類別 Derived Class),
子類別繼承了父類別的屬性與方法。
注意1:
繼承是可以傳遞,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;
}
執行結果