C# 3.0 物件導向程式設計

Similar documents
Visual Basic 2005 程式語言

運算子多載 Operator Overloading

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

Microsoft Word - 投影片ch11

投影片 1

The Embedded computing platform

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Microsoft PowerPoint - 13_ClassAndObj.ppt

投影片 1

CHAPTER VC#

untitled

PowerPoint Presentation

Microsoft Word - ch04三校.doc

投影片 1

untitled

《大话设计模式》第一章

Microsoft PowerPoint - C_Structure.ppt

(Microsoft Word - wes _\246p\246\363\250\317\245\316LED\277O\305\343\245\334\252\254\272A.doc)

untitled

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

Microsoft Word - chap12.doc

Microsoft PowerPoint - 08_Class

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

Microsoft PowerPoint - P766Ch06.ppt

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

Microsoft Word - 物件導向編程精要.doc

新・解きながら学ぶJava

The golden pins of the PCI card can be oxidized after months or years

Microsoft Word - 01.DOC


C/C++基礎程式設計班

Excel VBA Excel Visual Basic for Application

Microsoft Word - ACL chapter02-5ed.docx

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

09_Constructor

Microsoft PowerPoint - chap07.ppt

Chapter 16 集合

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

Strings

105Tr_CIS1

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

C/C++ Programming

第二章 簡介類別

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Microsoft Word - chap10.doc

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

透過.NET C# 程式實作 OO 建國科技大學資管系饒瑞佶

第二章 簡介類別

CC213

mvc

文档 3

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

INTRODUCTION TO COM.DOC

untitled

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

多層次傳銷與獎金系統

(procedure-oriented)?? 2

Microsoft PowerPoint - VB14.ppt

Microsoft Office SharePoint Server MOSS Web SharePoint Web SharePoint 22 Web SharePoint Web Web SharePoint Web Web f Lists.asmx Web Web CAML f

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

EJB-Programming-4-cn.doc

Microsoft PowerPoint - ch6 [相容模式]

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

提问袁小兵:

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

Chapter 9: Objects and Classes

c_cpp

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD

Microsoft PowerPoint - plan08.ppt

FY.DOC

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

C++

踏出C++的第一步

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

untitled

Microsoft Word

Transcription:

C# 3.0 程式語言物件導向程式設計 講師 : 林賢達 Peter.lin@imestech.com 1 課程大綱 物件導向基礎概念 類別 (Class) 類別成員 (Class Member) 封裝 (Encapsulation) 繼承 (Inheritance) 2 物件導向基礎概念 什麼是物件導向 (Object Oriented)? 物件導向是將問題領域中涉及的人 事 物予以物件化, 透過這些物件之間的訊息傳遞, 相互溝通協調, 執行某項工作 Windows 檔案管理 :System.IO 命名空間 Directory 類別 : 建立 移動目錄和列舉子目錄 File 類別 : 建立 複製 刪除 移動和開啟檔案 StreamReader 和 StreamWriter 類別 : 以特定的編碼方式讀取檔案內容 3 1

物件導向基礎概念 物件導向程式設計 (OOP) 是以物件導向分析設計 (OOAD) 產出的圖表為基礎 UML( 統一建模語言 ) + 工具 :IBM Rational Rose,Visio,SmartDraw,DynamicDraw 系統分析 : 功能需求 系統規格系統設計 : 系統規格 設計圖表程式開發 : 設計圖表 定義類別 4 物件導向基礎概念 使用案例 (Use Case) 使用案例 : 規劃系統功能的範圍, 做什麼? 不做什麼 角色 : 參與系統運作的使用者或外部系統 5 物件導向基礎概念 使用案例描述 申請門號描述 :(1) 顧客填寫申請表 : 身分證號碼 姓名 出生年月日 住址 手機號碼 申請日期等 (2) 店員查核身分證明文件 從案例描述中找出候選的類別 名詞 : 物件 ( 顧客 店員 出生年月日 ) 或狀態 ( 姓名 住址等 ) 動詞 : 行為, 例如填寫申請表 查核身分 6 2

類別 類別是一組具有相同資料結構和操作的物件的集合 類別對這些具有相同性質的物件的抽象, 描述物件的共同特徵 類別定義了一個物件的 " 狀態 " 和 " 行為 " 使用類別的私有欄位來描述與保存物件的內部狀態 使用類別中的方法去定義物件的行為 類別定義了一個範本, 使用此範本可以建立一個或多個物件 7 宣告類別 使用 class 關鍵字宣告類別 存取修飾詞 class 類別名稱 : object {// 存取級別 類別名稱 父類別 // 類別成員 // 類別主體 class{ 類別成員 資料成員 : 常數, 欄位和屬性 方法成員 : 方法 事件, 建構函式和解構函式 8 實體化 (Instatiation) 使用類別來建立物件的過程 使用 new 關鍵字 Car mycar = new Car(); 沒有可存取的建構子 : 使用工廠模式建立物件 FileStream fs = File.Create("C:\123.txt") ; 使用反射 (Reflection) Type t= Type.GetType("Car") ; 9 3

類別 VS 物件 類別是在設計階段時完成, 物件是類別在執行階段的實體, 佔用記憶體空間且具有生命週期 類別是物件範本 物件是類別的執行實體具有各自的狀態 10 物件 VS 物件變數 ( 物件參考 ) 物件變數儲存的是物件的參考位址, 而非物件本身 Car mycar ; // 物件變數 mycar = new Car() ; // 物件 mycar new Car() 堆疊 (Stack) 堆積 (Heap) 11 類別成員 常數 (Constant): 代表與類別相關聯的常數值 欄位 (Field): 類別中的變數 方法 (Method): 負責執行類別中的計算 ( 處理 ) 屬性 (Property): 對類別中欄位值的存取邏輯 事件 (Event): 用於說明發生了什麼事情 建構函式 (Constructor) 和解構函式 (Destructor): 分別用於對類別進行實體化和摧毀物件 12 4

封裝 (Encapsulation) 把屬性和方法封裝在類別中, 然後使用類別建立物件 ( 類別的執行實體 ), 接著使用物件存取屬性和叫用方法 封裝的好處 良好的封裝可以增加內聚性, 降低耦合性 類別內部的實現可以自由修改 類別具有清晰的對外開放介面 13 封裝 使用存取修飾詞來達到封裝的目的 private: 只允許在類別中存取之 protected: 只允許在類別或子類別中存取之 internal: 只允許在相同專案中存取之 protected internal: 只允許在類別 子類別或相同專案中存取之 public: 任何地方均可存取之 14 封裝 ( 續 ) 方案 類別 A private vv1 ; internal vv2 ; protected v3 ; protected internal v4 ; public v5 ; 專案 1 類別 B 類別 C : 類別 A 類別 D : 類別 A 專案 2 類別 E 15 5

屬性 屬性提供了對物件內部狀態的存取 屬性實現了物件的封裝性 : 不直接操作類別的資料內容, 而是透過存取器來進行存取 特性 由 get/set 存取器來控制對內部狀態的存取, 當取值時會叫用 get 函式 ; 賦值時則會叫用 set 函式, 可以在 get/set 函式提供存取邏輯 內部是函式 ( 定義 ), 外部則像個欄位 ( 使用上 ) 16 屬性 使用 get/set 函式存取私有欄位 注意 : 屬性名稱後面不可以有 () 存取修飾詞資料類型屬性名稱 { get { // 取值 Return 私有欄位 ; set { if (value<0) value =0 ; 私有欄位 = value ; // 賦值 //value 關鍵字表示外部傳入的值 17 屬性 唯讀屬性 (ReadOnly) 存取修飾詞資料類型屬性名稱 { get { return 私有欄位 ; 唯寫屬性 (WriteOnly) 存取修飾詞資料類型屬性名稱 { set { 私有欄位 =value ; 18 6

索引器 (Indexer) 索引器是一個特殊的屬性, 它提供了使用索引方式方便地存取類別的集合資料的方法 索引器通常在類別中表示元素集合 public class Sale ( private Customer[] _customers ; public Sale() { _customers = new Customer[10] ; 19 索引器 索引器的定義類似屬性 屬性名稱是 this, 表示目前物件, 參數列包含在中括號 [] 內, 不是小括號 () public Customer Client [ int index] { get { return _customers[index] ; set { if (value!= null) { _customers[index] = value ; 20 索引器 使用索引器可以像操作陣列的方式來存取物件中的集合 Sale Peter = new Sale() ; Peter[0] = new Customer ("A") ; Peter[1] = new Customer ("B") ; Peter[2] = new Customer ("C") ; 21 7

方法 方法可用於定義物件的行為 無傳回值, 不管有無參數, 方法名稱後面一定要有小括號 () [ 存取修飾詞 ] void 方法名稱 ( 參數宣告 ) { 有傳回值 [ 存取修飾詞 ] 資料類型方法名稱 ( 參數宣告 ) { 22 建構函式 類別的特殊方法, 主要用於初始化實體的資料成員 當使用 new 關鍵字實體化物件時, 由.NET CLR 自動叫用 特性 建構函數名稱必頇與類別名稱相同, 而且不可有傳回值 ( 不使用 void 關鍵字 ) 個數不定 ( 使用重載 Overload), 可以有一個以上的建構函式 23 建構函式 定義建構函式 即使沒有定義它, 編譯器也會自動為類別提供一個預設的建構函式 public class 類別名稱 { public 類別名稱 () { // 初始化 當實體化物件時, 由.NET CLR 叫用 類別名稱物件變數 = new 類別名稱 () ; 24 8

建構函式 重載建構函式 public 類別名稱 (String firstname, String lastname) : base () { public 類別名稱 (String firstname, String lastname) : this (firstname, lastname, 0) { 建構函式之間的叫用 使用 this 關鍵字 25 解構函式 建構函數名稱必頇是 ~ 類別名稱, 而且不可有參數和傳回值 ( 不使用 void 關鍵字 ) 用於釋放資源 當物件被 Garbage Collection 回收時, 會自動被叫用 ~ 類別名稱 () { // 釋放資源 26 特性 (Attribute) 使用中括弧 ([]) 提供特殊的資料 可用於類別 方法和屬性 例如標題 版本 Web 服務 組件 安全性和自訂設定 等 [WebMethod()] public void HelloWorld() { 27 9

建立物件 宣告後初始化 ( 使用 new 關鍵字 ) BankAccount acc ; acc = new BankAccount() ; 宣告同時初始化, 使用預設建構函式 BankAccount acc =new BankAccount() ; 宣告同時初始化, 使用重載建構函式 BankAccount acc =new BankAccount("Peter", "Lin") ; BankAccount acc =new BankAccount("Peter", "Lin", 1000) ; 28 摧毀物件 GC ( 資源回收器,Garbage Collection) 當記憶體不夠時,GC 將回收不再被使用物件佔用的資源 使用物件變數 = Nothing 標示不再被使用 使用 GC.Collect() 強制回收資源 29 靜態 (Static) 成員 可建立全域變數 全域方法或常數 ( 隱含的靜態成員 ) 靜態成員不屬於任何物件, 可以使用類別名稱直接存取 double radius = 10 ; Double area = Math.PI * Math.Pow(radius, 2) ; 若將類別中的某個成員宣告為 static, 該成員稱為靜態成員 30 10

靜態成員 靜態成員 VS 實體成員 靜態成員直接由類別存取 ; 實體成員由物件存取 靜態成員是屬於類別 : 實體成員則屬於類別的實體 物件 靜態方法為類別所有, 因此不用建立類別的實體就可以叫用 例如 System.Math 類別 31 靜態資料成員 允許一個類別的多個實體共用相同的欄位 使用 static 關鍵字 存取修飾詞 class 類別名稱 { public static 資料類型欄位名稱 ; 直接使用類別名稱來存取 static 欄位 類別名稱. 欄位名稱 = 值 ; // 無需建立物件 32 靜態方法成員 使用 static 關鍵字 存取修飾詞 class 類別名稱 { public static 資料類型方法名稱 ( 參數宣告 ) { 使用類別名稱來存取 static 方法成員 類別名稱. 方法名稱 ( 引數 ) ; // 無需建立物件 靜態方法成員只能存取類別中的靜態資料成員 33 11

命名空間 (Namespace) 使用命名空間來組織類別 ( 邏輯的儲存位置 ) 增強可讀性, 例如 System.IO 降低類別名稱的衝突 namespace 命名空間名稱 1 { 存取修飾詞 class 類別名稱 { 命名空間名稱 1. 類別名稱命名空間名稱 2. 類別名稱 類別實際的儲存位置是組件 (dll), 與命名空間無直接關係 34 命名空間 完全引用 從命名空間的最外層開始引用 NS1.Class1 c; 匯入命名空間 在程式碼檔上方使用 using 關鍵字匯入要使用的命名空間 using NS1 ; using Other = NS2 ; Class1 c1; Other.Class1 c2 ; // 命名空間的別名 (Alias) 35 部分類別 (Partial Class) C# 2.0 可以將類別 結構或介面的定義拆分到一個以上的原始碼檔案中 public class BankAccount { private double _blance; 在類別宣告前加入 partial 關鍵字 public partial class BankAccount { public double WithDraw(double ) {; 36 12

部分類別 什麼情況下使用部分類別? 開發大型專案時, 將一個類別分佈於多個獨立檔案中可以讓多位程式開發人員同時對該類別進行處理 將視覺化設計器自動建立的原始碼與開發人員編寫的原始碼分開, 避免誤動作造成錯誤 (Visual Studio 在建立 Windows 表單 ASPX 網頁時都使用此方法 ) 37 部分類別 部分類別的限制 同一類別的所有部分都必頇定義在同一組件 各個部分必頇使用相同的存取修飾詞 如果將任意部分宣告為抽象, 則整個類別都被視為抽象類別 如果將任意部分宣告為 sealed, 則整個類別都被視為 sealed 如果將任意部分宣告時指定父類別, 則整個類別都將繼承該類別 38 繼承 (Inheritance) 繼承是使用已存在的類別為基礎建立新類別的技術 子類別從父類別獲取 public internal 和 protected 成員 ( 不包含建構函式和解構函式 ), 而且可以定義自己的成員 C# 只支援單一繼承, 子類別有且僅有一個父類別, 也就是繼承關係是一對一 使用繼承我們可以衍生出無數個子類別, 子類別還可以建立自己的子類別 39 13

繼承 為什麼要使用繼承? 原始碼重用, 減少撰寫相同的程式碼 設計重用, 在父類別定義公開的成員, 然後由其衍生新的子類別, 子類別可以有自己的成員 通常用於表示 "is a" 的關係, 如果 A 類別是從 B 類別中繼承而來, 即 A 是 B 的子類別, 則我們可以說 :"class A is-a class B" 40 繼承 使用冒號 (:) 宣告類別子類別繼承某個父類別 如果沒有明確指定繼承哪一個父類別, 則 C# 預設繼承自 object 存取修飾詞 class 類別名稱 { 存取修飾詞 class 子類別名稱 : 父類別名稱 { 41 繼承 使用 abstract 宣告的類別必頇被繼承, 不能被實體化, 這種類別又稱為抽象類別 使用 sealed 宣告的類別不能被繼承 ( 防止繼承 ) 42 14

繼承 :Demo NumericTextBox 只允許輸入數字的文字方塊 步驟 繼承自 System.Windows.Forms.TextBox 覆寫 OnKeyPress 方法, 檢查輸入字元 if (! Char.IsDigit(e.KeyChar)) { e.handled = true ; 43 使用 base 關鍵字 在子類別中叫用父類別的方法成員 可以叫用 public protected 和 internal 方法 存取修飾詞 Class 子類別名稱 : 父類別名稱 { public 資料類型方法名稱 ( 參數宣告 ) { base. 方法名稱 ( 參數 ) ; base 不是一個真正的物件 44 課程大綱 多形 (Polymorphism) 重載 (Overload) 覆寫 (Overrides) 介面 (Interface) 委派 (Delegate) 事件 (Event) 45 15

多形 (Polymorphism) 同一個操作作用在不同的類別實體 ( 物件 ), 不同的類別有不同的解釋, 產生不同的執行結果 多個類別具有同名方法, 但有不同的操作 樂器可以演奏歌曲, 不同的樂器有不同的演奏方式, 例如 : 鋼琴 : 用手彈鍵盤提琴 : 用手拉琴弓長笛 : 用嘴吹口管 46 多形 實作方式 類別 : 使用重載 (Overload) 來實現多形 在編譯時, 根據參數類型和傳回類型等資訊來決定執行哪一個操作 繼承 : 透過子類別覆寫 (Overrides) 父類別的 Overridable 方法來實作多形 在執行時, 才會根據實際情況來決定執行哪一個操作 介面 : 類別實作在介面所定義的成員 一個類別可實作多個介面 47 重載 (Overload) 編譯時期的多形性通過重載方法來實現, 使用參數類型來確認叫用哪一個方法 在一個類別中的方法可以有多個不同的版本 : 有相同的函式名稱, 但參數的個數 順序和資料類型必頇不同 public OrderItem GetOrderItem() { return new OrderItem(); public OrderItem GetOrderItem(int itemid) { return this.orderitems(itemid) ; 48 16

覆寫 (Override) 執行時期的多形性通過子類別覆寫父類別中的虛擬方法來實現 子類別為了滿足個別需求重新定義某個方法的不同實作, 也就是在子類別中覆寫從父類別繼承而來的方法 只有虛擬方法和抽象方法才能被覆寫 49 覆寫 使用 override 關鍵字來覆寫父類別的 virtual 或 abstract 方法 方法名稱, 參數宣告和傳回類型都必頇相同 執行時期將確定叫用物件是什麼類別的實體, 然後叫用適當的覆寫方法 50 虛擬 (Virtual) 方法 使用 virtual 關鍵字宣告虛擬方法 [ 存取修飾詞 ] virtual 資料類型方法名稱 ( 參數宣告 ); 類別可以定義虛擬方法 虛擬屬性以及虛擬索引子 它的子類別能夠覆寫這些成員, 實現類別的多形性 虛擬方法可以有實作 51 17

抽象 (abstract) 方法 在父類別只定義全部子類別所共用的一般形式, 讓每個子類別各自實作其細節, 父類別本身必提供這些方法的實作細節 使用 abstract 關鍵字宣告抽象方法, 可以看成是沒有實作的虛擬方法 [ 存取修飾詞 ] abstract 資料類型方法名稱 ( 參數宣告 ); 繼承抽象類別的子類別, 它必頇實作抽象類別中的所有抽象方法 52 抽象方法 包含一個或多個抽象方法的類別, 必頇宣告成抽象類別 [ 存取修飾詞 ] abstract class 類別名稱 ( 參數宣告 ) { // 抽象方法 因為抽象類別沒有完整的實作, 所以不能建立抽象類別的物件 53 Override VS Overload Override Overload 位置存在於繼承關係的類別同一個類別 方法名稱相同 參數宣告相同 傳回類型相同 相同 必頇不同 可以不同 54 18

介面 (Interface) 介面為類別提供了藍圖 (blueprint), 只提供定義, 但不含實作部分 實現介面的類別必頇提供介面成員的實作 介面本身可以從多個基底 ( 父 ) 介面衍生而來 55 介面 定義方法 屬性和事件的簽章 (Signature) 使用 interface 關鍵字 interface 介面名稱 { 資料類型屬性名稱 { set; get; void 方法名稱 ( 參數宣告 ); 資料類型方法名稱 ( 參數宣告 ); 介面也可以繼承, 使用冒號 (:) 56 委派 (Delegate) 委派是函式的封裝, 代表某一類函式 這些函式都具有相同的簽章 : 相同的參數類型和傳回值類型 委派類型指定它所代表的方法之傳回類型和參數宣告, 也就是它可以代表具有相同的參數列和傳回類型的任何一個方法 委派是一個類型, 當實體化時需提供一個函式參考作為建構函數的參數, 此函數必頇和委派具有相同的簽章 57 19

委派 為什麼要使用委派? 提供更靈活的方法叫用 用於非同步回呼 (Asynchronous Callback): 由於產生委派實體是一個物件, 所以可以將其作為參數來傳遞, 也可以將其賦值給屬性 此時非同步方法便可以將一個委派作為參數, 並且以後可以叫用該委派 多執行緒程式設計中使用委派來指定啟動一個執行緒時叫用的方法 提供事件處理機制, 使用委派指定某個事件的處理函式 58 委派 委派的宣告方式與方法的宣告方式相似 使用 delegate 宣告一個委派物件, 宣告時需指定委派所代表函式的參數宣和傳回值類型 存取修飾詞 delegate 資料類型委派類型名稱 ( 參數宣告 ) ; 委派類型均繼承自 Delegate 或 MulticaseDelegate 代表一組具有相同參數宣告與傳回值類型的函式 public 資料類型方法名稱 ( 參數宣告 ) { 59 委派 使用委派 : 先宣告委派類型, 再產生實體並指定所代表具體函式 使用 new 關鍵字建立委派的實體, 同時在括號內指定一個具體的函式 委派類型名稱委派物件變數 ; 委派物件變數 = new 委派類型名稱 ( 函式名稱 ) ; 使用委派實體, 並傳入給委派所代表方法的參數來叫用其代表的函式 委派物件變數.Invoke ( 引數 ) ; 60 20

委派 使用 delegate 叫用來排序陣列 SortAscending 遞增排序 : 2, 1, 3 1, 2, 3 SortDescending 遞減排序 : 2, 1, 3 3, 2, 1 宣告 delegate 類型 delegate void SortMethod (int[] intarray) ; 61 委派 定義 SortAscending 與 SortDescending 方法 private void SortAscending (int[] IntArray) { Array.Sort(IntArray) ; private void SortDescending (int[] IntArray) { Array.Sort(IntArray) ; Array.Reverse(IntArray) ; 62 委派 建立委派實體並指定所代表的具體函式, 然後叫用函式 private void SortArray(bool Ascending, int[] IntArray) { SortMethod del; if (Ascending == true) del = New SortMethod(AddressOf SortAscending) ; else del = New SortMethod(AddressOf SortDescending) ; del.invoke(intarray) ; 63 21

事件 使用委派來實作事件處理機制, 稱為事件委派 事件委派的基本形式 public delegate void EventHandler (object sender, object, EventArgs e) ; object sender: 來源物件 EventArgs e,system.eventargs 類別的實體或衍生類別實體, 包含事件的相關訊息 64 事件.NET Framework 定義了許多的事件委派 public delegate void KeyEventHandler(object sender, KeyEventArgs e) ; public delegate void MouseEventHandler(object sender, MouseEventArgs e) ; 自訂事件委派 public delegate void NameEventHandler(object source, NameEventArgs e) ; 必頇定義 NameEventArgs 類別 65 事件委派.NET Framework 的事件委派實例 最常見的 Button Click Event Handler 66 22

事件 使用 event 關鍵字宣告事件名稱, 它的類型為事件委派 public event NameEventHandler OnNameHandler ; 觸發事件 OnNameListEvent(this, new NameListEventArgs()) ; 建立物件 Protected NameList MyList = New NameList(); 67 事件 事件處理函式, 參數宣告必頇與事件委派一致 private void ShowNameListInfo(object sender, NameListEventArgs e) { 使用 += 動態建立事件與處理函式的關聯 NameListEventHandler EventHandlerDelegate = new OnNameListEventHandler(ShowNameListInfo); mylist.onnamelistevent += EventHandlerDelegate; 68 事件 建立事件與事件處理函式的關聯 ( 續 ) mylist.namelistevent += new OnNameListEventHandler(ShowNameListInfo); 使用 -= 動態取消關聯 NameListEventHandler EventHandlerDelegate = new OnNameListEventHandler(ShowNameListInfo); mylist.onnamelistevent -= EventHandlerDelegate; mylist.namelistevent - = new OnNameListEventHandler(ShowNameListInfo); 69 23

Q & A 24