程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 委托、信號和消息反饋的模板實現技術

委托、信號和消息反饋的模板實現技術

編輯:vc教程

憋了很長一段時間的想法,在這裡說說,希望聽聽諸位高手的意見。

我寫過不少C++程序(當然比起高手還是差遠了),寫過庫也寫過客戶程序。一般庫都會提供一些好用的類供客戶程序使用,不少庫還可以讓客戶程序響應庫內的某些事件。比如MFC/ATL/VCL提供消息響應,很多ActiveX提供自定義消息響應,甚至是系統底層的中斷調用都可以列入這個范疇。然而,正是以上這些“反向”的調用讓我覺得很煩惱。

1 繼承+多態

乍一看是理所當然的選擇,庫中的類把響應處理函數設置為虛函數,客戶程序可以繼承這個類並且重載響應函數。以某個Socket類為例,可以提供一個OnRecv函數用來響應數據包到達的處理。客戶程序只需要重載OnRecv並進行自己的處理就可以了。

struct Socket { // base class
 virtual void OnRecv();
};
stuct MySocket { // your event-handle class
 virtual void OnRecv() { /* do sth here ... */ }
}

疑問:很多時候這樣做實在很煩,特別是做小程序的時候,或者需要快速做原型的時候,一眼望去小小的程序一上來就繼承了一大堆東西,頗為不爽。只是想著能省事一點,希望能像那些腳本語言一樣快速綁定消息響應,而不是以繼承開始工作——我已經害怕看到長長的類繼承樹了,很多時候根本不必要繼承整個類;又或者某些類只提供一個接口而不是具體的類又或者需要多重繼承,處理都有一定麻煩;最麻煩的莫過於有時候需要改變響應處理,難道繼承好幾個下來麼——這麼多虛表也是浪費啊。

wangtianxing老大點評:為了使用Socket就必須繼承Socket,這可以說是Socket的設計的問題。如果需要實現類似的功能的話,可以寫成如下,雖然和繼承 Socket 沒有多少本質的差別,不過確實把消息處理類和Socket的實現扯開了。:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved