[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day14 – Object Oriented (1)
前言
把OO放在這麼後面講,或許有一些人會認為是不是太晚了。
因為通常training的需求,前半段是需要一點即戰力以及workshop的練習,所以Day1~Day13的說明,應該已經可以讓學員開始練習自己動手做幾個網頁,把學到的東西應用在上面了。
從Day14開始,就是進階的課程了,而進階的課程,OO的concept是一切的基礎,而OO也是可以很簡單,可以很抽象的東西。需要搭配很多例子(包括實例以及sample code)才比較容易說明清楚。
我會盡力的點出概念,也歡迎各位討論與回饋。
這一篇文章先介紹幾個概念:
- 類別跟實體
- 建構式
- 多載
- 封裝
- 繼承
- 多型
Issues
- 類別跟實體
- 類別:具有相同屬性和功能的物件抽象集合
例如:class為豐田汽車,其屬性可能有型號、價錢等等... - 實體:一個真實的物件(instance)
例如:透過豐田汽車的class (類似spec),產生一台實體的豐田汽車,這台豐田汽車就擁有了豐田汽車這個class所定義的屬性、方法、事件等等特性.. - 實體化:建立物件的過程,使用new關鍵字來建立
- 類別:具有相同屬性和功能的物件抽象集合
- 建構式
- 對類別進行初始化的動作
- 建構式與類別同名,無return值,也不需要void
- 可透過overloading來達到不同方式的初始化動作
例如:
new TOYOTA("ALTIS");
new TOYOTA("CAMRY");
- 多載(overloading)
- 相同function名稱,不同參數個數或不同型別
- 在不改變父類別原方法的基礎上,新增子類別相同功能名稱,不同功能內容的作法
VB.NET中有Optional,請盡量避免這樣的設計,註:C#4.0也有 - 其他類似的部分:
- overrides,覆寫,與父類別相同function名稱,參數個數與return型別相同。 強制覆寫其繼承自父類別的功能內容,使其滿足子類別的需求
- virtual,可覆寫。宣告為可覆寫後,繼承鏈中的子類別方可覆寫此屬性或方法
- 封裝
- 減少耦合
- 讓用的人不用管內部如何運作,抽象化的使用
- 類別內部可自由修改
- 擁有清晰的對外介面
如同電燈開關,我們只需要知道怎樣可以開,怎樣可以關。不必知道實際背後是怎麼進行開關。代表背後的東西可以抽換、修改,而不會影響到使用上的邏輯。
- 繼承
- 子類別有父類別非private的屬性和function
- 子類別可擴展父類別所沒有的屬性和功能
- 子類別可以用自己的方式,實現父類別的屬性和功能
- 調用父類別,使用base關鍵字
- 繼承的兩種使用方式:『不要用』跟『謹慎使用』
因為繼承本身就是一種強耦合的類別關連,例如當父類別需要修改某個方法內容,但已經有許多子類別繼承此方法。
可能只有一半的子類別要更新成新的方法內容,另一半要維持舊的方法方法內容。如此一來,就是強耦合造成的問題
舉例:電燈都有開關的方法,子類別可以覆寫開關的方法內容,也可以繼承之後不覆寫。
- 多型
- 多型的原理:當方法被呼叫時,無論物件是否被轉換為父類別,只有位於物件繼承鏈最末端的實作方法會被呼叫。也就是虛擬方法是按照其執行時類型,而非編譯時類型進行動態繫結呼叫的。
- 不同的物件可以執行相同的動作,但要透過他們自己的實作程式碼來執行
- 子類別以父類別的身份出現
- 子類別在執行時以自己的方式來實作
- 子類別以父類別的身份使用時,子類別特有的屬性和方法不可以使用
舉例:- 類別關係:
父類別為電燈,有宣告為public的turn on與turn off兩個function。
子類別為日光燈。
場景:如果客廳很暗,則打開電燈。 - 原始版本:
- 多型版本(run time):
- 多型進階版本(一點點IoC概念):
- 對場景來說,可以focus在『客廳』與『是否打開電燈』,而不管實際應用場景時,TurnOn這個動作是由父類別的電燈instance,或是子類別的日光燈所執行打開的動作。這樣的設計可以讓我們更專心於抽象地應用電燈的邏輯與功能。
if(客廳.IsDark){電燈.TurnOn();}
if(客廳.IsDark){日光燈.TurnOn();}
if(客廳.IsDark){Get電燈().TurnOn();} private 電燈 Get電燈() { //進行邏輯判斷後,return電燈或其子類別 instance }
- 類別關係:
最後,請想學習的客倌,看完這篇文章思考一下,下列的問題該如何回答:
- 類別與instance的差異?
- overrides, overloading, virtual的差異?
- 封裝的意義與目的?
- 繼承要考慮的issue?繼承的兩種使用方式?為什麼?
- 多型的意義?多型的目的?舉例多型的應用
blog 與課程更新內容,請前往新站位置:http://tdd.best/