c++以代理的方式来实现接口化编程
假如你项目代码本身已经实现了很多的实体类,但并未采用接口,可以考虑以这种方式来实现接口化编程
struct ITest
{virtual void Test()=0;
};class CTest
{
public:void Test() {}
};class CTestProxy:public ITest
{void Test() { m_object.Test();}
protected:CTest m_object;
};class TestObject
{
public:static void Demo(){ITest *pTest=new CTestProxy;pTest->Test();}
};
改过为模板化
template<class T, class I>
class CTestProxy:public I
{void Test() { m_object.Test();}
protected:T m_object;
};
再来看子类的实现
struct ISubTest:public ITest
{virtual void SubTest()=0;
};class CSubTest:public CTest
{
public:void SubTest() {}
};template<class T, class I>
class CSubTestProxy:public CTestProxy
{void SubTest() { m_object.SubTest();}
};
此方法可以使用接口的形式重用原有实现代码
实体类与接口交互
struct ITest
{virtual void Test()=0;virtual ITest* GetProxy()=0;virtual void SetProxy(ITest* pTest)=0;
};class CTest
{
public:CTest(){m_pTest=NULL;}void Test() { }ITest* GetProxy() { return m_pTest; }void SetProxy(ITest* pTest) { m_pTest=pTest; }template<class T>T* Get(){ITest* pProxy=GetProxy();T* pT=dynamic_cast(pProxy);return pT;}protected:ITest *m_pTest;
};template<class T, class I>
class CTestProxy:public I
{
public:CTestProxy(){SetProxy(this);}void Test() { m_object.Test();}ITest* GetProxy() { return m_object.GetProxy(); }void SetProxy(ITest* pTest) { m_object.SetProxy(pTest); }protected:T m_object;
};
添加一个指针便有了两边交互的能力
外部类继承:
需要将T m_object声明成为指针,该类并非为导出类,避免对外暴露实现
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
