繼承
為物件導向的三大特性之一(封裝、多型)
,你可以想像老爸與兒子的關係,兒子會繼承老爸所擁有的特徵(屬性)和)財產(方法)(現實上不一定,但請官爺們想簡單點),兒子可能會有老爸的大鼻子或小嘴巴,並且可以開著老爸的車(財產)出去玩,這就是繼承。
繼承父類別(基底類別 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繼承而來的屬性與方法
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();
(看看上面父類別的程式碼)
執行結果
正在開『Blue』的車時速『50』在移動
(上面正是父類別的執行結果)
但這時如果子類別有有一個建構子會著麼樣呢 ??
先自訂子類別建構子如下,然後在執行,會發現結果為會先執行父類別建構子再執行子類別建構子
。
/// <summary>
/// 子類別繼承Car
/// </summary>
public class BMWCar :Car
{
//BMWCar類別建構子
public BMWCar()
{
Speed = "BMW500";
Color = "BWM_Red";
}
//BMW的屬性引擎
public string BMWPower;
}
執行結果
正在開『BMW_red』的車時速『BMW500』在移動
(會先執行父類別建構子再執行子類別建構子)