[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day14 – Object Oriented (1)

[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day14 – Object Oriented (1)

前言
把OO放在這麼後面講,或許有一些人會認為是不是太晚了。
因為通常training的需求,前半段是需要一點即戰力以及workshop的練習,所以Day1~Day13的說明,應該已經可以讓學員開始練習自己動手做幾個網頁,把學到的東西應用在上面了。

從Day14開始,就是進階的課程了,而進階的課程,OO的concept是一切的基礎,而OO也是可以很簡單,可以很抽象的東西。需要搭配很多例子(包括實例以及sample code)才比較容易說明清楚。

我會盡力的點出概念,也歡迎各位討論與回饋。

這一篇文章先介紹幾個概念:

  1. 類別跟實體
  2. 建構式
  3. 多載
  4. 封裝
  5. 繼承
  6. 多型


Issues

  1. 類別跟實體
    1. 類別:具有相同屬性和功能的物件抽象集合
      例如:class為豐田汽車,其屬性可能有型號、價錢等等...
    2. 實體:一個真實的物件(instance)
      例如:透過豐田汽車的class (類似spec),產生一台實體的豐田汽車,這台豐田汽車就擁有了豐田汽車這個class所定義的屬性、方法、事件等等特性..
    3. 實體化:建立物件的過程,使用new關鍵字來建立


  2. 建構式
    1. 對類別進行初始化的動作
    2. 建構式與類別同名,無return值,也不需要void
    3. 可透過overloading來達到不同方式的初始化動作
      例如:
      new TOYOTA("ALTIS");
      new TOYOTA("CAMRY");


  3. 多載(overloading)
    1. 相同function名稱,不同參數個數或不同型別
    2. 在不改變父類別原方法的基礎上,新增子類別相同功能名稱,不同功能內容的作法
      VB.NET中有Optional,請盡量避免這樣的設計,註:C#4.0也有
    3. 其他類似的部分:
      • overrides,覆寫,與父類別相同function名稱,參數個數與return型別相同。 強制覆寫其繼承自父類別的功能內容,使其滿足子類別的需求
      • virtual,可覆寫。宣告為可覆寫後,繼承鏈中的子類別方可覆寫此屬性或方法


  4. 封裝
    1. 減少耦合
    2. 讓用的人不用管內部如何運作,抽象化的使用
    3. 類別內部可自由修改
    4. 擁有清晰的對外介面
      如同電燈開關,我們只需要知道怎樣可以開,怎樣可以關。不必知道實際背後是怎麼進行開關。代表背後的東西可以抽換、修改,而不會影響到使用上的邏輯。


  5. 繼承
    1. 子類別有父類別非private的屬性和function
    2. 子類別可擴展父類別所沒有的屬性和功能
    3. 子類別可以用自己的方式,實現父類別的屬性和功能
    4. 調用父類別,使用base關鍵字
    5. 繼承的兩種使用方式:『不要用』跟『謹慎使用』
      因為繼承本身就是一種強耦合的類別關連,例如當父類別需要修改某個方法內容,但已經有許多子類別繼承此方法。
      可能只有一半的子類別要更新成新的方法內容,另一半要維持舊的方法方法內容。如此一來,就是強耦合造成的問題

      舉例:電燈都有開關的方法,子類別可以覆寫開關的方法內容,也可以繼承之後不覆寫。


  6. 多型
    1. 多型的原理:當方法被呼叫時,無論物件是否被轉換為父類別,只有位於物件繼承鏈最末端的實作方法會被呼叫。也就是虛擬方法是按照其執行時類型,而非編譯時類型進行動態繫結呼叫的。
    2. 不同的物件可以執行相同的動作,但要透過他們自己的實作程式碼來執行
    3. 子類別以父類別的身份出現
    4. 子類別在執行時以自己的方式來實作
    5. 子類別以父類別的身份使用時,子類別特有的屬性和方法不可以使用
      舉例:
      • 類別關係:
        父類別為電燈,有宣告為public的turn on與turn off兩個function。
        子類別為日光燈。
        場景:如果客廳很暗,則打開電燈。
      • 原始版本:
      • 
        if(客廳.IsDark){電燈.TurnOn();}
      • 多型版本(run time):
      • 
        if(客廳.IsDark){日光燈.TurnOn();}
      • 多型進階版本(一點點IoC概念):
      • 
        if(客廳.IsDark){Get電燈().TurnOn();}
        private 電燈 Get電燈()
        {
          //進行邏輯判斷後,return電燈或其子類別 instance
        }
      • 對場景來說,可以focus在『客廳』與『是否打開電燈』,而不管實際應用場景時,TurnOn這個動作是由父類別的電燈instance,或是子類別的日光燈所執行打開的動作。這樣的設計可以讓我們更專心於抽象地應用電燈的邏輯與功能。

 



最後,請想學習的客倌,看完這篇文章思考一下,下列的問題該如何回答:

  1. 類別與instance的差異?
  2. overrides, overloading, virtual的差異?
  3. 封裝的意義與目的?
  4. 繼承要考慮的issue?繼承的兩種使用方式?為什麼?
  5. 多型的意義?多型的目的?舉例多型的應用



blog 與課程更新內容,請前往新站位置:http://tdd.best/