DLL中的接口暴露

疯哥哥 2009-02-12 12:38:04
比如DLL中暴露了一个抽象接口
class Interface
{
virtual ~Interface() = 0 {}
virtual method1() = 0;
...
};

//DLL内部实现的头文件InterfaceA.h,目前DLL使用者(Client)是不可见的.
class InterfaceA : public Interface
{
virtual method1();
...
}
Client可以通过工厂创建一个具体实例.

现在问题是:
因为具体实例的细节全部隐藏了.Client只能继承Interface抽象类, 想继承InterfaceA也没有办法...
是不是要公开头文件才行 (InterfaceA.h),应该这样做吗...?
...全文
273 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssm1984119 2009-02-12
  • 打赏
  • 举报
回复
我想你做抽象类的目的在于向Client屏蔽某些信息。DLL库中可能有很多继承自抽象类的具体实现,但提供给Client的是统一的接口,Client无需关心DLL是如何处理具体细节的。既然设计目的如此,就没有必要让Client去了解一个具体的类结构InterfaceA,否则这种做法就与你的设计原则相违背。
iambic 2009-02-12
  • 打赏
  • 举报
回复
建议在DLL中只使用C接口。
hhyttppd 2009-02-12
  • 打赏
  • 举报
回复
#ifdef DLLCLASSTEST_EXPORTS
#define DLLCLASSTEST_API __declspec(dllexport)
#else
#define DLLCLASSTEST_API __declspec(dllimport)
#endif


struct DLLCLASSTEST_API IMath
{
virtual int add(int a , int b) = 0;
};

class DLLCLASSTEST_API CMath :public IMath
{
public:
int add(int a , int b);
};

hhyttppd 2009-02-12
  • 打赏
  • 举报
回复
你可以导出类。


catnm 2009-02-12
  • 打赏
  • 举报
回复
up
hhyttppd 2009-02-12
  • 打赏
  • 举报
回复
导出类啊,MFC也是这么干的吧
疯哥哥 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ssm1984119 的回复:]
我想你做抽象类的目的在于向Client屏蔽某些信息。DLL库中可能有很多继承自抽象类的具体实现,但提供给Client的是统一的接口,Client无需关心DLL是如何处理具体细节的。既然设计目的如此,就没有必要让Client去了解一个具体的类结构InterfaceA,否则这种做法就与你的设计原则相违背。
[/Quote]
如果公开的话,也只公开InterfaceA的头文件,这样虽然暴露了一些细节,但是Client还是不知道我这个InterfaceA是如何实现的...这样不行吗?
因为之前只想使用抽象接口,没有考虑这个问题.所以也不知道怎么怎么办比较好.呵呵

疯哥哥 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ssm1984119 的回复:]
我想你做抽象类的目的在于向Client屏蔽某些信息。DLL库中可能有很多继承自抽象类的具体实现,但提供给Client的是统一的接口,Client无需关心DLL是如何处理具体细节的。既然设计目的如此,就没有必要让Client去了解一个具体的类结构InterfaceA,否则这种做法就与你的设计原则相违背。
[/Quote]
嗯,是的啊.本意是想隐藏实现细节来着,但是如果client真的需要继承一个具体的类,怎么办....

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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