OO思想: 关于C++的接口类

    文章出处:http://hi.baidu.com/%CF%F4%CA%AE%C8%FD%C0%C9/blog/item/651b47dad560f8d1b7fd48f1.html

 

    多态是OO的一大特点,通常我们把只有纯虚函数的抽象类,叫做接口类(Interface Class),或者是协议(Protocol Class)

    习惯上类名会用大写I开头,但这不是必须的,比如下面一个类声明。

    class IPool

    {

        public:

        virtual  ~Pool() = 0{}

        virtual void* allocate(size_t  size) = 0;

        virtual void* deallocate(void* p) = 0;

        virtual void* destroy(void) = 0;

    };

 

    下面简单说说使用抽象类的好处。

    1. 隐藏实现细节

    因为真正的实现是由抽象类的继承类来实现的,所以这个接口的使用者并不需要关心它内部具体是如何实现的,只需要了解它的功能特性,是用来干什么的。比如,现在IPool有两个继承版本,LargePool和SmallPool,使用者在使用的时候,可能是这样:

    //我现在想使用大容量的池

    IPool*  pool = PoolFactory->Create( PT_ LARGE);

    ...

    //我现在又想使用小一点的池

    IPool*  pool = PoolFactory->Create( PT_SMALL );

 

    //甚至,没有多余的枚举和宏,而是这样:

   

    //我现在想使用大容量的池

    IPool*  pool = PoolFactory->Create( _T("LARGE") );

    ...

    //我现在又想使用小一点的池

    IPool*  pool = PoolFactory->Create( _T("SMALL") );

 

 

    这样,使用者只需要了解large和small对应的两个池的功能和特点,并不关心它们是如何实现的。甚至根本不知道LargePool和SmallPool这两个类的代码声明,LargePool和SmallPool内部可能还有很多可用的成员数据和方法,但是只暴露出一部分子集供别人调用。

 

    2.  减少耦合性

    不同的模块可能有不同的接口,一个稍复杂的内部实现,可能是两个接口的功能合并。这个时候,对一个接口做了大的调整,不会影响到另一个接口。呵呵,这样说有点绕,举个例子吧,一个模块ModuleA,提供了一个接口IB供模块ModuleB使用,也提供了一个接口IC供模块ModuleC使用。

    在ModuleA的内部,IB和IC可能需要用同一个类ImplBC实现,这个类只是把不同的子集提供给不同的模块使用。

    这个时候如果对IB做了一些调整,那么,IC原来的接口不变,C模块不需要对调用代码做调整。

    注意:另一种情况是,ImplBC这个类没有提供接口,而是把赤裸裸的类声明暴露给MoudleB和MoudleC,这个时候,如果需要调整对MoudleB的调用关系,只能是修改ImplBC的类声明。虽然对于ModuleC可能不需要修改源代码,但是ModuleC还是需要根据ImplBC头文件的变更,来重新编译一个新版本。仔细体会一下两者之间的区别。

    你可能觉得重新编译一下没有什么啊,如果你做过DLL给别人使用你就知道了,假如你发布了一个SDK供别人使用,你不能因为SDK中的DLL内部做的调整,也要求使用DLL的人也得根据你更新的头文件来重新编译一次把。这种情况下,尽量不要调整接口,使用COM是最佳选择。试想一下,如果DX SDK每次更新,都要求你重新编译你的源代码,那是什么情况。

 

    3.  更实际的好处  编译时间快了

    由于以上两个原因,这一点就很好理解了。相信一定有人遇到这样情况:有时可能只是对一个类的private成员数据做了一些调整,但是结果是有大批大批的文件需要重新编译。。。所以,根据情况,看看是不是需要,能不能使用接口类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值