0

これから説明することを達成するための最善のオブジェクト指向の方法について意見を求めています。ゲームなどのイベントシステムになるものを書いていますが、抽象クラスが多いので、できるだけ拡張できるようにしたいと思っています。これらのうちの 2 つは、1 つのイベントを監視するために割り当てられたモニターと、イベントが発生した場合に呼び出される関数ポインターをラップするコールバックです。コールバックが必要とするデータを送信したいときに問題が発生します。送信されるデータは、(関数シグネチャに応じて) サブクラス固有になり、サブクラス化されたモニターに格納されます。実行を呼び出す前に、このデータをコールバックに渡すことができるようにしたいのですが、モニターの観点からはすべてが抽象的であるため、これは困難です。私' 可能な限り最高のオブジェクト指向の方法でこれを行う方法についての提案を探していますが、まだ私が好きなものを思い付いていません。コールバックは実際にディスパッチされるために別のクラスに送信されるため、データはある時点でそれらの内部に到達する必要があります。

参考までに、モニター抽象クラス

#pragma once

#include "DIVE_GUI_Types.h"
#include "DIVE_GUI_Callback.h"
#include "DIVE_GUI_Event_Dispatcher.h"
#include <map>
#include <string>

/*
Class to monitor events to be handled by the event system.
*/

class DIVE_GUI_Event_Monitor
{
private:
    friend class                                        DIVE_GUI_Kernel;
    DIVE_GUI_Event_Dispatcher*                          m_Dispatcher;
    static DIVE_HANDLE                                  m_Active_GUI;

protected:
    const std::string                                   m_Event_ID;
    std::map<DIVE_HANDLE, DIVE_GUI_Callback*>           m_GUI_Map;
    virtual bool Dispatch() = 0;

public:
    void Update();
    std::string Get_Event_ID() const { return m_Event_ID; }
    DIVE_GUI_Event_Monitor(const std::string& id) : m_Event_ID(id) { }
    void Add_Callback(DIVE_HANDLE, DIVE_GUI_Callback* function);
};

そしてコールバック抽象クラス

#pragma once

/*
Abstract class representing a wrapper for a callback function as per the Command design     pattern.
*/

class DIVE_GUI_Callback
{
public:
    virtual void Excecute_Callback() const = 0;
};

あらゆる意見/提案を歓迎します。ありがとう!

4

1 に答える 1

1

私の理解が正しければ、このデータをコールバック コンストラクターに提供する必要があります。がありCallback1Callback2から派生したとしますDIVE_GUI_Callback。したがって、コードは次のようになります。

DIVE_GUI_Event_Monitor* monitor; 
monitor->Add_Callback(Callback1(specific_data_1));
monitor->Add_Callback(Callback2(specific_data_2));

この特定のデータは、 で使用されExcecute_Callback()ます。

于 2013-04-10T20:55:07.620 に答える