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声明成为指针,该类并非为导出类,避免对外暴露实现


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部