Delegate implement

用宏来实现:

	// шаблон класса делегата
	MYGUI_TEMPLATE   MYGUI_TEMPLATE_PARAMS
	class MYGUI_C_DELEGATE
	{
	public:
		typedef  MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS  IDelegate;

		MYGUI_C_DELEGATE () : mDelegate(nullptr) { }
		MYGUI_C_DELEGATE (const MYGUI_C_DELEGATE  MYGUI_TEMPLATE_ARGS& _event)
		{
			// забираем себе владение
			mDelegate = _event.mDelegate;
			const_cast< MYGUI_C_DELEGATE  MYGUI_TEMPLATE_ARGS& >(_event).mDelegate = nullptr;
		}
		~MYGUI_C_DELEGATE () { clear(); }

		bool empty() const { return mDelegate == nullptr; }

		void clear()
		{
			if (mDelegate)
			{
				delete mDelegate;
				mDelegate = nullptr;
			}
		}

		MYGUI_C_DELEGATE  MYGUI_TEMPLATE_ARGS & operator=(IDelegate* _delegate)
		{
			delete mDelegate;
			mDelegate = _delegate;
			return *this;
		}

		MYGUI_C_DELEGATE  MYGUI_TEMPLATE_ARGS & operator=(const MYGUI_C_DELEGATE  MYGUI_TEMPLATE_ARGS& _event)
		{
			// забираем себе владение
			delete mDelegate;
			mDelegate = _event.mDelegate;
			const_cast< MYGUI_C_DELEGATE  MYGUI_TEMPLATE_ARGS& >(_event).mDelegate = nullptr;

			return *this;
		}

		void operator()( MYGUI_PARAMS )
		{
			if (mDelegate == nullptr) return;
			mDelegate->invoke( MYGUI_ARGS );
		}

	private:
		IDelegate * mDelegate;
	};

对于CDelegate1 而言:

其宏替换为:

// один параметр
#define MYGUI_SUFFIX       1
#define MYGUI_TEMPLATEtemplate
#define MYGUI_TEMPLATE_PARAMS  <typename TP1>
#define MYGUI_TEMPLATE_ARGS    <TP1>
#define MYGUI_T_TEMPLATE_PARAMS  <typename T, typename TP1>
#define MYGUI_T_TEMPLATE_ARGS    <T, TP1>
#define MYGUI_PARAMS       TP1 p1
#define MYGUI_ARGS         p1
#define MYGUI_TYPENAME     typename


#include "MyGUI_DelegateImplement.h"

下面给出人肉宏替换便于分析:

基类:IDelegate

	// базовый класс всех делегатов
	template   <typename TP1>
	class IDelegate1
	{
	public:
		virtual ~IDelegate1() { }
		virtual bool isType( const std::type_info& _type) = 0;
		virtual void invoke( TP1 p1 ) = 0;
		virtual bool compare(  IDelegate1  <T, TP1>  * _delegate) const = 0;
		virtual bool compare(IDelegateUnlink * _unlink) const { return false; }
	};

即CDelegate1 类为:

	// шаблон класса делегата
	template    <typename TP1>
	class CDelegate1
	{
	public:
		typedef  IDelegate1 <T, TP1>  IDelegate;

		CDelegate1 () : mDelegate(nullptr) { }
		CDelegate1 (const CDelegate1  <T, TP1>& _event)
		{
			// забираем себе владение
			mDelegate = _event.mDelegate;
			const_cast< CDelegate1  <T, TP1>& >(_event).mDelegate = nullptr;
		}
		~CDelegate1 () { clear(); }

		bool empty() const { return mDelegate == nullptr; }

		void clear()
		{
			if (mDelegate)
			{
				delete mDelegate;
				mDelegate = nullptr;
			}
		}

		CDelegate1  <T, TP1> & operator=(IDelegate* _delegate)
		{
			delete mDelegate;
			mDelegate = _delegate;
			return *this;
		}

		CDelegate1  <T, TP1> & operator=(const CDelegate1  <T, TP1>& _event)
		{
			// забираем себе владение
			delete mDelegate;
			mDelegate = _event.mDelegate;
			const_cast< CDelegate1  <T, TP1>& >(_event).mDelegate = nullptr;

			return *this;
		}

		void operator()( TP1 p1 )
		{
			if (mDelegate == nullptr) return;
			mDelegate->invoke( p1 );
		}

	private:
		IDelegate * mDelegate;
	};

关系:

CDelegate1 包含 IDelegate1 mDelegate;


IDelegate1  包含所代理的方法:


Delegate 进一步的印象:


我现在理解C的含义,C的意义应该是Container。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值