C++ Delegate 委派
Design Pattern 軟體工程與哲學

Delegate (委託模式), and its difference in C++ and C#

Delegate (委託模式) 的概念一直懂得不是很徹底,此篇試圖釐清一些委託的概念。

先了解委託的精神是什麼, from
http://en.wikipedia.org/wiki/Delegation_(programming)

“delegation refers to one object relying upon another to provide a specified set of functionalities. In research, this is often referred to as consultation or as aggregation in modeling.”

另外委託的概念與 Design Pattern 中的 Observer pattern 有關,這部分讀者可以另外再去研讀。

上網查詢了C++關於委託的文章,還是不能充分理解。以下會先介紹微軟官網 C# Delegation 的範例,接著試著將該範例以C++實現,看能否勾勒出C++關於委託的概念。

http://msdn.microsoft.com/zh-tw/library/aa288459(v=vs.71).aspx
在範例一中,

public delegate void ProcessBookDelegate(Book book);

宣告了委託型別,注意他不屬於任一 class, 在調用時

bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));

BookDB::ProcessPaperbackBooks 的 argument type 為 ProcessBookDelegate. 而 ProcessBookDelegate 的實作則依賴於 “new ProcessBookDelegate(PrintTitle)”, 也就是 PrintTitle. 注意 Test::PrintTitle 是 static function, 不然 compile 時會沒有其位置資訊。

這樣的做法是要 run-time 決定 BookDB::ProcessPaperbackBooks 的行為,而且此行為會受BookDB 物件內容影響。範例一中還有一次委託:

bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));

這次是傳物件的 method 進 BookDB::ProcessPaperbackBooks.

結論:Delegation (委託) 大致上可以說是從外部傳 static function 或 class method 進要委託工作的人。

要委託工作的人 run-time 調用 delegate function (compile-time 要委託工作的人並不知道 delegate 是誰),然後此 delegate function 會依照要委託工作的人的狀態工作。

使用時機就如同上述範例一般:當要 run-time 決定要對底下所有物件 (ex: Book) 做不同處理時,可以用 Delegation.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。