폴킴 (Paul Kim) -你都記得 You Remember

曾經有那樣深刻的感情,因為家裡反對和當時自己的懦弱 在那之後幾乎看到廟宇就許下:願把自己下半輩子的幸福都給你,只願你幸福喜樂 所以看到這段歌詞非常有感,年紀即將過40,所以真的得若無其事地活下去  네가 아주 행복했음 좋겠어 要是你過得幸福就好了 대신 내가 불행하면 좋겠어 要是換成我變得不幸就好了 기억나지 않았으면 좋겠어 如果什麼都不記得就好了 다시 돌아갈 수 있음 좋겠어 如果能夠再次回頭就好了 너의 찰나와 영원들이 願你所有的剎那和永恆 너만의 것이 되길 都變成專屬於你自己的時刻 사실 난 행복을 잘 몰라 但其實我真的不懂所謂的幸福是什麼 너는 아무렇지 않게 살아가야 하니까 因為你得若無其事地活下去

OOP 動態繫結和靜態繫結


出處:程式設計經典、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;              // rTaffic類別的物件參考

             // myCarCar類別的物件實體, 同時繼承Traffic類別
             Car myCar = new Car();

             // myAirplaneAirplane類別的物件實體, 同時繼承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();
         }

    }

留言

這個網誌中的熱門文章

C# 裡 List用法

"需要有物件參考才能使用非靜態欄位、方法或屬性"的問題排除

達因筆 & 表面能 原理