001:
回调函数方式:
typedef void (__stdcall *DownloadCallback)(const char* pURL, bool bOK);
void DownloadFile(const char* pURL, DownloadCallback callback)
{
cout << "downloading: " << pURL << "" << endl;
callback(pURL, true);
}
void __stdcall OnDownloadFinished(const char* pURL, bool bOK)
{
cout << "OnDownloadFinished, URL:" << pURL << " status:" << bOK << endl;
}
DownloadFile("www.baidu.com", OnDownloadFinished);
002-1:
接口方式(虚函数):
class IDownloadSink { public: virtual void OnDownloadFinished(const char* pURL, bool bOK) = 0; }; class CMyDownloader { public: CMyDownloader(IDownloadSink* pSink) :m_pSink(pSink) { } void DownloadFile(const char* pURL) { cout << "downloading: " << pURL << "" << endl; if(m_pSink != NULL) { m_pSink->OnDownloadFinished(pURL, true); } } private: IDownloadSink* m_pSink; }; class CMyFile: public IDownloadSink { public: void download(const char* pURL) { CMyDownloader downloader(this);//想使用DownloadFile函数的时候,对方需要回调自己实现的OnDownloadFinished,所以将this传递给对方,自己已经把相应的实现了 downloader.DownloadFile(pURL); } virtual void OnDownloadFinished(const char* pURL, bool bOK) { cout << "OnDownloadFinished, URL:" << pURL << " status:" << bOK << endl; } };
CMyFile f1; f1.download("www.baidu.com");
002-2:
虚函数:
003:class CWorkFlow { void init() { _a = 0; _b = 0; } int _a; int _b; public: void Start() { // 初始化 init(); // 调用处理数据 Handle( _a, _b ); // 报告结果 Report( _a); } virtual void Handle( int &a, int &b ) = 0; virtual void Report( int iRet) = 0; }; class CMain : public CWorkFlow { public: void Handle( int &a, int &b ) { a = a + b/2; } void Report( int iRet) { printf("iRet = %d/n", iRet); } }; int main() { CMain main; main.Start(); }
事件、委托:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 委托 { public delegate void GreetingDelegate(string name); //新建的GreetingManager类 public class GreetingManager { //在GreetingManager类的内部声明delegate1变量 public event GreetingDelegate MakeGreet; public void GreetPeople(string name) { if (MakeGreet != null) { //如果有方法注册委托变量 MakeGreet(name); //通过委托调用方法 } } } class Program { private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name); } static void Main(string[] args) { GreetingManager gm = new GreetingManager(); gm.MakeGreet += EnglishGreeting; gm.MakeGreet += ChineseGreeting; gm.GreetPeople("Jimmy Zhang"); } } }