這邊的作法,就是利用繼承的方式,來讓callback的介面,可以傳遞到下一層的類別內。
[C++]
1.先建立要用來當通知器的介面
//用來Callback用的通知器
class INotifier
{
//要用來Callback的介面
public:
virtual void NoReturnFunc(void) = 0;
virtual bool BoolReturnFunc(void) = 0;
virtual void PassValFunc(int Val) = 0;
}
2.建立要用來操作的類別
<head file>
class COperator
{
private:
INotifier mNotifyTarget; //被通知的對象
public:
COperator(INotifier NotifyTarget); //建構子
}
2.1.這邊的範例是建立操作物件時,就順便指定被通知的對象。
<cpp>
COperator::COperator(INotifier NotifyTarget)
{
this->mNotifyTarget = NotifyTarget;
if( this->mNotifyTarget != NULL )
this->mNotifyTarget->NoReturnFunc();
}
3.建立被通知的對象,被通知的對象需要繼承通知介面。
<head file>
class CReceiver : public INotifier
{
private:
COperator *mOperator;
public:
CReceiver(void);
//繼承來的介面,內容要自行實做
public:
virtual void NoReturnFunc(void);
virtual bool BoolReturnFunc(void);
virtual void PassValFunc(int Val);
}
3.1.這邊是在被通知對象被建立時,就把自己塞給操作物件。
<cpp>
CReceiver::CReceiver(void)
{
this->mOperator = new COperator(this);
}
之後,COperator就可以透過INotifier所提供的介面,把事件回傳給CReceiver了。
[C#]
在C#底下,要做這件事情就變得比較簡單了。一開始要先在操作物件內先宣告要用來當事件的函式。
public class COperator
{
//使用委派宣告一個函式介面
public delegate void OnNoReturnFuncEvent();
//宣告此介面為一個事件
public event OnNoReturnFuncEvent NoReturnFuncNotifier = null;
//要做callback事件處理的函式
void OperatingFunc()
{
if(this.NoReturnFuncNotifier != null)
this.NoReturnFuncNotifier();
}
}
之後就在要被通知的對象內,將自己要用來作回呼的函式,加到事件內。
這樣的作法,可以添加複數個事件,也就是可以有2個以上的物件將自己的回呼介面,加到這個事件內。
而當事件發生的時候,這些有加入事件的物件,都會依序收到同樣的事件通知。
public class Receiver
{
//宣告操作物件
private COperator mOperator = new COperator();
public Receiver()
{
//把自已的callback介面加到操作對象去
this.mOperator.NoReturnFuncNotifier += this.OnNoReturnFucn;
}
//這邊的介面宣告要與COperator所宣告的委派函式介面一樣
public void OnNoReturnFucn()
{
//做要做的事情
}
}
No comments:
Post a Comment