C组件编程结论

 1 接口规定形式,组件实现内容\n        2 一个组件可以有多接口。\n        3 多个组件可以有共同的接口,但接口的内容各自组件,各自规定。\n 4 接口定义好一般就不改了。需要新功能时可以追加接口、追加组件。\n        5 由于组件内实现了接口,接口生存周期要长于组件。\n \n\n 客户端调用组件\n\n\n\n 以上模式至少实现了:\n\n客户端和组件分隔\n组件和接口分割\n接口和接口实现分隔\n各自维护互不影响\n三、接口实现原理\n 接口的实现原理:\n\nclass IX{                       //first interface\npublic:\n    virtual void Fx1()=0;\n    virtual void Fx2()=0;\n};\n \nclass Iy{                        //second interface\npublic:\n    virtual void Fy1()=0;\n    virtual void Fy2()=0;\n};\n \nclass CA:public Ix,public Iy{\n    public:\n    virtual void Fx1(){ cout\u003C\u003C\"Fx1\"\u003C\u003Cenl;}\n    virtual void Fx2(){ cout\u003C\u003C\"Fx2\"\u003C\u003Cenl;}\n \n    virtual void Fy1(){ cout\u003C\u003C\"Fy1\"\u003C\u003Cenl;}\n    virtual void Fy2(){ cout\u003C\u003C\"Fy2\"\u003C\u003Cenl;}      \n};\n        以上代码是个比喻,是展现实现的效果,至于如何实现,下面的设计更巧。 \n\n 在上面实现中Ix和Iy是实现接口的纯抽象类。该类内部仅仅包含纯虚函数,这个函数仅仅用来指针占位,并无实质的实现。\n\n        为了实现纯虚函数的实体,在组件CA中继承两个接口Ix和Iy,在CA中实现了虚函数的集体化。可以将抽象类看成是空的表单,在派生类(CA)中实现表单填写。\n\n 四、实质的接口定义\n4.1 首先定义一个接口符号\n 在objbase.h中,定义了一个interface的名词术语。\n\n    #define interface struct\n 注意:这里interface定义成struct,是因为在struct内的成员全部是public无需特殊生命。\n\n4.2 更真实的接口定义\n#ifndef __OBJBASE__\n#define __OBJBASE__\n \n#include \u003Cobjbase.h>\ninterface IX{                       //first interface\n    virtual void Fx1()=0;\n    virtual void Fx2()=0;\n};\n \ninterface Iy{                        //second interface\n    virtual void Fy1()=0;\n    virtual void Fy2()=0;\n};\n \n#endif\n 4.3 一个实例\nca.cpp\n\n \n#include \u003Cistream.h>\n#include \u003Cobjbase.h>\n \nvoid trace(const char *pMsg ) {cout \u003C\u003CpMsg \u003C\u003Cendl;}\n \n \ninterface IX{                       //first interface\n    virtual void Fx1()=0;\n    virtual void Fx2()=0;\n};\n \ninterface Iy{                        //second interface\n    virtual void Fy1()=0;\n    virtual void Fy2()=0;\n};\n \nclass CA:public Ix,public Iy{\n    public:\n    virtual void Fx1(){ cout\u003C\u003C\"CA::Fx1\"\u003C\u003Cenl;}\n    virtual void Fx2(){ cout\u003C\u003C\"CA::Fx2\"\u003C\u003Cenl;}\n \n    virtual void Fy1(){ cout\u003C\u003C\"CA::Fy1\"\u003C\u003Cenl;}\n    virtual void Fy2(){ cout\u003C\u003C\"CA::Fy2\"\u003C\u003Cenl;}      \n};\n \nint main(){\n \nCA *pA = new CA;\ntrace(\"this is client call component \");\nIx *pIx = pA;\ntrace(\"client: use the Ix interface\");\npIx->Fx1();\npIx->Fx2();\ntrace(\"client: use the Iy interface\");\npIy->Fy1();\npIy->Fy2();\ntrace(\"client:delete  interface\");\n \ndelete pA;\nreturn 0;\n}\n输出: \n\nthis is client call component\nclient: use the Ix interface\nCA::Fx1\nCA::Fx2\nclient: use the Iy interface\nCA::Fy1\nCA::Fy2\nclient:delete interface\n五、结论\n 客户端调用组件,组件调用接口,接口调用接口的实现,每一步都有一个节点环节,这样就使得【客户端】与【接口实现】这两个实质性的程序不产生关系,达到独立维护的目的。\n\n 当客户程序和组件在一个源文件中时,并无必要将其分开。但当客户和组件是在动态链接库中时,此种隔离是必须的。下章将进一步隔离抽象,让客户端不再使用CA的指针。\n\n参考资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值