Download presentation
Presentation is loading. Please wait.
Published by黄 宓 Modified 7年之前
2
06 類別與物件
3
6.1 類別與物件 目前的程式設計主流是物件導向 (OOP),Visual C# 已提供完整的物件導向功能。在物件導向設計裡,物件可以被封裝 ( 保護) 和繼承 ( 重複使用)。因為物件的封裝會使物件受到保護,要存取物件必須透過屬性 (Property)、方法 (Method) 和事件(Event)。物件的封裝如同日常生活中的 ATM 提款機,其提款必須透過正確的方式才能提款 ( 輸入帳號和密碼),而不可用不當破壞方式提款。
4
6.1.1 類別與物件的關係 物件 (Object) 可說是一件東西,物件具有屬性 (Property)、方法(Method) 以及觸發的事件 (Event)。例如:David ( 物件) 代表一個人 ( 類別),David 的身高是 183 公分 ( 屬性),David 會跑步 ( 方法)。如果用程式表示如下: 類別 (Class) 則是一個物件的設計藍圖,而物件則是由該類別所建立出來的實體。例如:建築師設計了一張房子的設計圖 ( 類別),工程人員可以根據這張設計圖,蓋出了很多棟的房子 ( 物件) 來。
5
6.1.2 定義類別 要自行定義類別必須使用「public class 類別名稱{ }」語法,public 也可以省略,並依需要在類別中定義類別成員 ( 包括欄位、屬性、方法和事件等),其中欄位相當於變數或常數,可以直接存取,而屬性則必須透過 get 或 set 指令才能存取。 定義類別的語法為:
6
存取修飾詞中,資料成員若宣告為 public 代表該資料為共用型態,其存取沒有限制,即允許目前應用程式中的所有類別均可存取。若宣告為 private 代表私有型態,只允許在類別內部使用。而protected 則可以在類別內部以及其子類別中使用,若省略關鍵字,系統的預設值為 private。 「欄位」相當於變數或常數,用以儲存物件的資料,可用一般的資料型別或其他的類別來宣告。「屬性」可以保護物件欄位,屬性的建立較為複雜,將在下一節中詳細說明。 「方法」用以表示該類別所擁有的行為。
7
6.1.3 建立物件
8
Visual C# 系統提供了許多內建類別,大部份的情況,設計者都是使用 Visual C# 所提供的內建類別。例如:在 Windows Form 應用程式模式中要使用 .NET Framework 內建的 Button 類別來產生物件的實體 ( 主控台應用程式模式中不能使用)
9
6.1.4 使用物件成員
12
6.1.5 欄位的限制 如果將類別中的「欄位」成員宣告為 public 共用型態,在任何地方均可存取,使用上非常方便,然而其特性為變數或常數,所以只能單純的設定或讀取其欄位值,無法以程式對欄位做各種處理。例如:設計駕駛練習的程式中,希望將速度限制在100 公里以內,若使用欄位就無法在事前檢查欄位值而加以限定。
14
6.2 屬性 屬性 (property) 是一個具有保護的變數,可以保護物件的正當存取,屬性具有讀取和寫入的特性,用以取得或設定一個物件的屬性值。由於屬性的讀取和寫入都是程式區塊,所以可以在讀取和寫入時撰寫程式碼對屬性值做各種處理。
15
6.2.1 屬性存取
18
6.2.2 唯讀屬性 只有 get 區塊而沒有 set 區塊的屬性稱為「唯讀屬性 (ReadOnly)」。唯讀屬性只能被讀取,不能設定其屬性值。例如:
19
6.2.3 唯寫屬性 同樣的,只有 set 區塊而沒有 get 區塊的屬性就變成唯寫屬性 (WriteOnly),唯寫屬性只能設定屬性值,而不能讀取屬性值。 例如:
20
6.3 方法 上一章建立方法時曾提及,加上 static 關鍵字宣告的方法,稱為為靜態方法,而省略 static 關鍵字宣告的方法,則為案例方法 (instance method)。靜態方法已在上一章詳細說明,此處僅就案例方法做介紹,例如建立計算矩形面積的 GetArea 案例方法:
21
6.3.1 呼叫案例方法 在同一類別中宣告的其他案例方法,可以直接呼叫此案例方法 ( 但同類別的靜態方法不可以呼叫同類別的案例方法)。與靜態方法最大不同是:案例方法在不同類別中則必須先建立物件,再以「物件. 案例方法」才能呼叫此案例方法。
24
6.3.2 多載 多載 (Overload) 是名稱相同但參數不同的方法。類別的方法中,允許使用多個相同名稱但參數資料型別不同或參數個數不同的方法,Visual C# 會根據所傳入的參數執行正確的方法,所以多載實際上是以參數來區分要執行那一個方法。
29
6.3.3 建構式 類別中有一個特殊的方法,稱為建構式 (Constructor),其名稱和類別名稱相同。當使用者建立新的物件時,會自動執行此建構式。利用這個特性,建構式常用來做為物件的初始化動作 ( 例如:設定變數初始值、開啟檔案、配置記憶體等⋯⋯)。 建構式不必傳回返回值,所以不必使用 void 宣告。建構式是一種方法,所以建構式也可以多載,如果沒有宣告建構式,Visual C# 編譯器會自動在執行階段建立預設為public 的建構式,但不會產生程式碼。 例如為 Car 類別建立一個自訂的建構式,可在建立物件時設定速度初始值:
33
6.3.4 解構式 當物件結束時會執行物件的解構式 (Destructor),通常我們會在解構式中處理如檔案關閉、記憶體回收的動作。由於現在 .NET Framework 會由 CLR 自動執行記憶體回收的動作,且加上解構式會影響執行效能,所以除非必要,建議不要使用解構式。 解構式的名稱和類別名稱相同,但前面必須加上「~」符號,例如為 Car 類別建立一個自訂的解構式,顯示物件已釋放的訊息:
36
6.4 靜態成員 在 節定義類別時,可用修飾詞 public、private 或 protected 定義不同存取範圍的類別成員,此外,還有一個 static 修飾詞用以宣告成員為靜態成員。
37
靜態成員是以「靜態類別. 靜態成員」來執行 ( 如Student
靜態成員是以「靜態類別. 靜態成員」來執行 ( 如Student.Name),且即使未用new 建立物件亦可直接使用類別中的靜態成員。靜態成員在記憶中只有儲存一份。
40
6.5 繼承 繼承 (Inherit) 是物件導向程式設計中非常重要的機制。繼承是從既有的類別建立新的類別,繼承後的類別稱為為子類別 (Child Class) 或衍生類別 (Derived Class),而被繼承的類別稱為為父類別 (Parent Class) 或基底類別 (Base Class)。
41
6.5.1 子類別的建立 要建立子類別非常簡單,只要在子類別的名稱後面加入冒號並指定父類別即可,例如要建立子類別 B 繼承父類別 A 的語法為: 子類別會繼承父類別中宣告為 public 及 protected 的成員 ( 包括欄位、屬性、方法和事件), private 的成員雖然可以繼承,但不能存取。
45
6.5.2 子類別的應用 繼承最大的好處是可以由已存在的類別來擴充自己所需的功能,原來已設計好的部分可以直接使用,設計者只需專心於擴充的部分即可。例如:若已存在一個計算長方形面積的類別,現在需要計算三角形面積,由於兩者的計算資料都是寬與高,可以直接繼承此長方形面積類別,新增一個計算三角形面積的公式即可。完成的新類別,不但可以計算三角形面積,也可以計算長方形面積,真是一舉兩得。
49
6.5.3 子類別多載 如果要在子類別新增與父類別相同名稱但參數資料型別不同或參數個數不同的方法多載,可直接在子類別中建立方法多載。當呼叫子類別的方法時,Visual C# 會根據所傳入的參數執行正確的方法。
52
6.5.4 保留父類別的多載方法 如果子類別的多載方法會使用到原有父類別多載方法功能,想在子類別中使用父類別的多載方法,並在子類別中擴充新的功能,而不必重新撰寫父類別原來就具有的功能,如此可以快速建立功能強大的多載方法。 要保留父類別的多載方法,只要在子類別的多載方法中使用 base 代替父類別名稱,即可在子類別中使用父類別的多載方法。
56
6.6 覆寫及遮蔽 多載是以參數來區別多個方法的不同,若是要在子類別中建立參數和原來父類別的參數完全相同的方法(即相同參數的多載),就必須在子類別中以覆寫或遮蔽方式建立方法。 6.6.1 覆寫 覆寫 (Override) 是在子類別中以相同名稱成員取代原來父類別中的成員 ( 包括屬性及方法),如果覆寫的是「方法」,則子類別參數必須和原來父類別的參數完全相同。 要完成覆寫必須在父類別的屬性及方法加入「virtual」關鍵字表示此為虛擬屬性及方法允許被覆寫,同時也要在子類別加上「override」進行覆寫。如果子類別中沒有加入 override 關鍵字,或子類別中方法的參數和父類別中的參數不同,將會產生錯誤。例如要以子類別 B 的 Method1 方法覆寫父類別 A 的 Method1 方法:
60
6.6.2 遮蔽 遮蔽 (Shadow) 則沒有父類別必須先做 virtual 宣告的限制,只要在子類別的方法上加入 new 關鍵字即可取代父類別中相同參數的方法。遮蔽相當於「強制覆寫」,遮蔽之後原有父類別的方法仍然可以在父類別使用。
63
6.7 綜合練習 物件的精神主要是封裝、繼承和多載,最後舉一個精簡的例子,將本章所有物件的關念及用法全部融合在內。
Similar presentations