在C++中,可以通过以下几种方式实现”隐藏实现,开放接口”:
1. 使用接口类
定义一个接口类,在里面声明纯虚函数,然后让实现类继承该接口类并实现纯虚函数。客户端代码只需要持有接口类的指针或引用,然后通过多态调用实现类的函数。
// 接口类 class IDevice { public: virtual void open() = 0; virtual void close() = 0; }; // 实现类 class Disk : public IDevice { public: void open() { /* 实现打开磁盘 */ } void close() { /* 实现关闭磁盘 */ } }; // 客户端代码 IDevice *p = new Disk(); p->open(); // 调用Disk::open() p->close(); // 调用Disk::close()
2. 利用PImpl构的实现
PImpl代表Pointer to Impementation,也就是将实现类包装在接口类内部,客户端持有接口类实例的指针,接口类再持有实现类实例的指针,实现解耦。
// 接口类 class Impl; class IDevice { public: IDevice(); ~IDevice(); void open(); void close(); private: Impl *pimpl; // 持有具体实现的指针 }; // 实现类 class Disk : public Impl { public: void open() { /* 实现打开磁盘 */ } void close() { /* 实现关闭磁盘 */ } }; // 接口类实现 IDevice::IDevice() { pimpl = new Disk(); } IDevice::~IDevice() { delete pimpl; } void IDevice::open() { pimpl->open(); } void IDevice::close() { pimpl->close(); }
3. 使用抽象基类
定义一个抽象基类,在里面声明纯虚函数,让实现类继承并实现这些函数。然后客户端通过该基类的指针或引用调用实现类的函数。
// 抽象基类 class IDevice { public: virtual void open() = 0; virtual void close() = 0; }; // 具体实现类 class Disk : public IDevice { public: void open() { /* 实现打开磁盘 */ } void close() { /* 实现关闭磁盘 */ } }; // 客户端代码 IDevice *p = new Disk(); p->open(); // 调用Disk::open() p->close(); // 调用Disk::close()
以上几种方式都是较典型的实现”隐藏实现,开放接口”的方案,可以根据具体需要选择适合的方式。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录