যোগ করার জন্য, আমি কমান্ড প্যাটার্নটিতে বিদ্যমান উত্তরাধিকার পদ্ধতিতে ফিট করার জন্য ফাংশন অবজেক্ট ব্যবহার করেছি; (কেবলমাত্র যেখানে OO দৃষ্টান্তটির সত্যিকারের OCP এর সৌন্দর্য আমি অনুভব করেছি); এছাড়াও এখানে সম্পর্কিত ফাংশন অ্যাডাপ্টার প্যাটার্ন যুক্ত করুন।
মনে করুন আপনার পদ্ধতিতে স্বাক্ষর রয়েছে:
int CTask::ThreeParameterTask(int par1, int par2, int par3)
কমান্ড প্যাটার্নের জন্য আমরা এটি কীভাবে ফিট করতে পারি তা আমরা দেখব - এর জন্য প্রথমে আপনাকে একটি সদস্য ফাংশন অ্যাডাপ্টার লিখতে হবে যাতে এটি ফাংশন অবজেক্ট হিসাবে ডাকা যায়।
দ্রষ্টব্য - এটি কুরুচিপূর্ণ এবং আপনি বুস্ট বাইন্ড সহায়ক ইত্যাদি ব্যবহার করতে পারেন তবে আপনি যদি না করতে চান বা না চান তবে এটি একটি উপায়।
// a template class for converting a member function of the type int function(int,int,int)
//to be called as a function object
template<typename _Ret,typename _Class,typename _arg1,typename _arg2,typename _arg3>
class mem_fun3_t
{
public:
explicit mem_fun3_t(_Ret (_Class::*_Pm)(_arg1,_arg2,_arg3))
:m_Ptr(_Pm) //okay here we store the member function pointer for later use
{}
//this operator call comes from the bind method
_Ret operator()(_Class *_P, _arg1 arg1, _arg2 arg2, _arg3 arg3) const
{
return ((_P->*m_Ptr)(arg1,arg2,arg3));
}
private:
_Ret (_Class::*m_Ptr)(_arg1,_arg2,_arg3);// method pointer signature
};
এছাড়াও, কলিংয়ে সহায়তা করার জন্য আমাদের উপরের শ্রেণীর জন্য একটি সহায়ক পদ্ধতি mem_fun3 প্রয়োজন।
template<typename _Ret,typename _Class,typename _arg1,typename _arg2,typename _arg3>
mem_fun3_t<_Ret,_Class,_arg1,_arg2,_arg3> mem_fun3 ( _Ret (_Class::*_Pm) (_arg1,_arg2,_arg3) )
{
return (mem_fun3_t<_Ret,_Class,_arg1,_arg2,_arg3>(_Pm));
}
এখন, পরামিতিগুলি আবদ্ধ করতে, আমাদের একটি বাইন্ডার ফাংশন লিখতে হবে। সুতরাং, এখানে এটি যায়:
template<typename _Func,typename _Ptr,typename _arg1,typename _arg2,typename _arg3>
class binder3
{
public:
//This is the constructor that does the binding part
binder3(_Func fn,_Ptr ptr,_arg1 i,_arg2 j,_arg3 k)
:m_ptr(ptr),m_fn(fn),m1(i),m2(j),m3(k){}
//and this is the function object
void operator()() const
{
m_fn(m_ptr,m1,m2,m3);//that calls the operator
}
private:
_Ptr m_ptr;
_Func m_fn;
_arg1 m1; _arg2 m2; _arg3 m3;
};
এবং, বাইন্ডার 3 শ্রেণি - বাইন্ড 3 ব্যবহার করতে একটি সহায়ক ফাংশন:
//a helper function to call binder3
template <typename _Func, typename _P1,typename _arg1,typename _arg2,typename _arg3>
binder3<_Func, _P1, _arg1, _arg2, _arg3> bind3(_Func func, _P1 p1,_arg1 i,_arg2 j,_arg3 k)
{
return binder3<_Func, _P1, _arg1, _arg2, _arg3> (func, p1,i,j,k);
}
এখন আমাদের কমান্ড ক্লাসের সাহায্যে এটি ব্যবহার করতে হবে; নিম্নলিখিত টাইপিডেফ ব্যবহার করুন:
typedef binder3<mem_fun3_t<int,T,int,int,int> ,T* ,int,int,int> F3;
//and change the signature of the ctor
//just to illustrate the usage with a method signature taking more than one parameter
explicit Command(T* pObj,F3* p_method,long timeout,const char* key,
long priority = PRIO_NORMAL ):
m_objptr(pObj),m_timeout(timeout),m_key(key),m_value(priority),method1(0),method0(0),
method(0)
{
method3 = p_method;
}
আপনি এটি কল কিভাবে এখানে:
F3 f3 = PluginThreadPool::bind3( PluginThreadPool::mem_fun3(
&CTask::ThreeParameterTask), task1,2122,23 );
দ্রষ্টব্য: f3 (); পদ্ধতিটি কল করবে টাস্ক 1-> থ্রিপ্যারামিটার টাস্ক (21,22,23) ;.
নীচের লিঙ্কে এই নিদর্শনটির সম্পূর্ণ প্রসঙ্গ