出處:程式設計經典、http://www.programmer-club.com/showSameTitleN/oop/40.html
一般在呼叫物件方法,有兩種和物件繫結的方式:
一、靜態繫結(Static binding)
同一類別的物件,在程式執行時必須能夠清楚分辨到到底是
存取哪個物件的屬性或執行哪個物件方法,
否則程式執行時無法分辨出是哪個物件的屬性或方法。
例如:
有兩個物件叫Car1 和Car2,兩個方法Forward()和BackWard(),哪個物件用哪個方法,用點號隔開就能分辨清楚。
Car1.Forward();
Car2.Backward();
此時,C#會對這兩個物件分配不同的記憶體空間。
二、動態繫結(Dynamic binding)
動態連結是指編譯器在進行編譯程式的階段時不將物件語法繫結在一起,而是將物件方法的位址建立一個虛擬表格(Virtual table),在程式執行階段時,再由虛擬表格判斷該呼叫那個物件的方法。
在程式執行階段時物件參考才決定要執行的方法,其作法是使用父類別的物件參考來選擇所要執行子類別物件實體的方法,透過這種技巧才可以做到真正的多型。
白話文說
物件導向程式設計四個特性之一為dynamic binding,其目的是達到程式延伸,彈性化和擴充性。可利用程式語言如C++中具有polymorphism的虛擬函數(virtual function)來達。
晚期連結也稱之寫動態連結(dynamic binding)。
簡單的說,就是物件的行為並不是在編譯時期 (compileir-time,就已經決定了。而是在程式執行時期於(晚期)(run-time)才動態地決定的。
如何動態地決定。就看物件當時的狀態(state)而定,物件封裝了所有可能的狀態處理方法,
並且根據外邊送來的訊息做出適當的反應。
這也就是晚期連結的意義,這是物件導向 一個很重要的精神。
所謂連結是將程式中所使用到的各名稱(包括程式名稱及變數名稱),分配到適當的記憶體位置,其中在編譯過程中即完成連結的稱為靜態連結(Static Binding),又稱為早期連結(Early Binding)。
如果是在程式執行過程中才完成連結的,則稱為動態連結(Dynamic Binding),又稱為延後連結(Late Binding)。到底繫結(Bunding)的定義為何?中文又可以翻成連結嗎?
較白話方式來解釋 dynamic binding 的真正意義應該翻成(動態繫綁)
----編譯過程中自動去成為一體
那麼其意義與 Linking 是不是一樣呢?
與 Linking 是不一樣的 dynamic Linking 的真正意義應該翻成(動態連綁)--編譯過程中自動去連進來
例子:
|
開始畫面 |
|
選擇1車子,加速前進2km |
|
選擇1車子兩次後,速度變4km;再換飛機兩次,速度變34km |
// 定義Traffic交通工具類別
class Traffic
{
protected static int _miles; // _miles用來記錄前進的公里數
public virtual void SpeedUp() // SpeedUp是空白,允許被子類別覆寫
{
}
}
// 定義Car車子類別繼承自交通工具類別
class Car : Traffic
{
public override void SpeedUp() // 覆寫父類別的SpeedUp方法
{
_miles += 2;
Console.WriteLine("\n 駕駛車子, 加速中, 前進 {0} 公里 .", _miles);
Console.WriteLine("--------------------------------------");
}
}
// 定義Airplane飛機類別繼承自交通工具類別
class Airplane : Traffic
{
public override void SpeedUp() // 覆寫父類別的SpeedUp方法
{
_miles += 15;
Console.WriteLine("\n駕駛飛機, 加速中, 前進 {0} 公里 .", _miles);
Console.WriteLine("--------------------------------------");
}
}
//主程式開始
class Program
{
static void Main(string[] args)
{
Traffic r; // r是Taffic類別的物件參考
// myCar是Car類別的物件實體, 同時繼承Traffic類別
Car myCar = new Car();
// myAirplane是Airplane類別的物件實體, 同時繼承Traffic類別
Airplane myAirplane = new Airplane();
int input;
while (true)
{
Console.Write("請問要駕駛->1.車子
2.飛機 其他.離開:");
input = int.Parse(Console.ReadLine());
if (input == 1)
{
r = myCar; //開車子,r參考指向myCar物件實體
}
else if (input == 2)
{
r = myAirplane; //開飛機,r參考指向myAirplane物件實體
}
else
{
break;
}
r.SpeedUp(); // 呼叫r參考指向物件實體的SpeedUp()方法
Console.WriteLine();
}
Console.Read();
}
}
留言