请教:基于接口编程的一些疑问。

s_51563946 2011-10-27 11:50:26
基于接口的编程是一种被广泛推广的方法,类似COM之类的组件都是这种方法的产物。它使用纯虚接口进行交互,杜绝了实现继承。这种强限制有一些好处,也导致了一些困难。

好处是,纯虚接口可以避免库与库之间的连接,例如我的dll都可以通过LoadLibrary的方式加载,也不用link在一起。这为插件设计提供了方便。

缺点是,具体的对象无法在栈上分配,无法实现继承将导致一些设计比较困难。

例如,考虑一个基于接口编程实现的GUI库,会发现实现这个库的扩展变得很困难:

class IWidget{};
class IButton : public IWidget{};
class ILable : public IWidget{};
class Button : public IButton{}
class Lable : public ILable{};

实现Button和Lable的代码会有很多都是相同的,一般来说这部分公共的代码都应该放到Widget的类里面去。但由于禁止了实现继承,这一步是做不到的。
另外一种办法是将公共的代码放到另外一个接口类里面,比如叫IWidgetImplHelper, 然后Button跟Lable持有一个WidgetImplHelper的实例,再将接口的调用转发到这个辅助类上面去,不过这样函数转发的代码也非常非常的多。
还可以使用WTL的办法,将公共实现写到模板里面:
template<typename C, typename I>
class WidgetTemplate : public I
{...};
class Lable : public WidgetTemplate<Lable, ILable>{...};
但是这样将导致将很多公共的代码都放到头文件中,编译效率将会非常低下,而且任意的代码修改将会导致很大的工程重新编译,纯虚接口带来的很多好处将不复存在。

那么在这个GUI库的设计上,该如何来满足开闭原则呢?库的使用者必须很方便的扩展这个库,而不需要改动到这个库的代码,甚至不用改动到这个库的dll。作为纯虚接口的库,只需要一些头文件,然后LoadLibrary这个库就能使用。该如何才能达人这点?

请教大家有什么好的建议么?
...全文
42 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
seacat_hello 2011-10-27
  • 打赏
  • 举报
回复
没有万能的方法,找到你需要注意的关键的点,好好设计就好了
qq120848369 2011-10-27
  • 打赏
  • 举报
回复
为什么要用类,自找苦吃,用纯C接口.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧