iT邦幫忙

DAY 14
7

ASP.NET 由淺入深系列 第 14

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

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

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

由於這邊篇幅有限,我會盡力的點出概念,也歡迎各位討論與回饋。
這一篇文章先介紹幾個概念:
1.類別跟實體
2.建構式
3.多載
4.封裝
5.繼承
6.多型

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)其他類似的部分:
(a)overrides,覆寫,與父類別相同function名稱,參數個數與return型別相同。 強制覆寫其繼承自父類別的功能內容,使其滿足子類別的需求
(b)virtual,可覆寫。宣告為可覆寫後,繼承鏈中的子類別方可覆寫此屬性或方法。

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

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

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

6.多型
(1)多型的原理:當方法被呼叫時,無論物件是否被轉換為父類別,只有位於物件繼承鏈最末端的實作方法會被呼叫。也就是虛擬方法是按照其執行時類型,而非編譯時類型進行動態繫結呼叫的。
(2)不同的物件可以執行相同的動作,但要透過他們自己的實作程式碼來執行
(3)子類別以父類別的身份出現
(4)子類別在執行時以自己的方式來實作
(5)子類別以父類別的身份使用時,子類別特有的屬性和方法不可以使用
舉例:
(a)類別關係:
父類別為電燈,有宣告為public的turn on與turn off兩個function。
子類別為日光燈。

場景:如果客廳很暗,則打開電燈。
(1)原始版本:

if(客廳.IsDark){電燈.TurnOn();}

(2)多型版本(run time):

if(客廳.IsDark){日光燈.TurnOn();}

(3)多型進階版本(一點點IoC概念):

if(客廳.IsDark){Get電燈().TurnOn();}
private 電燈 Get電燈()
{
  //進行邏輯判斷後,return電燈或其子類別 instance
}

對場景來說,可以focus在『客廳』與『是否打開電燈』,而不管實際應用場景時,TurnOn這個動作是由父類別的電燈instance,或是子類別的日光燈所執行打開的動作。這樣的設計可以讓我們更專心於抽象地應用電燈的邏輯與功能。

================================
最後,請想學習的客倌,看完這篇文章思考一下,下列的問題該如何回答:
1.類別與instance的差異?
2.overrides, overloading, virtual的差異?
3.封裝的意義與目的?
4.繼承要考慮的issue?繼承的兩種使用方式?為什麼?
5.多型的意義?多型的目的?舉例多型的應用


上一篇
91之ASP.NET由淺入深 不負責講座 Day13 - ADO.NET
下一篇
91之ASP.NET由淺入深 不負責講座 Day15 - Abstract與Interface
系列文
ASP.NET 由淺入深30

尚未有邦友留言

立即登入留言