<b>乌托邦式接口和实现别离技术</b>[VC/C++编程]
本文“<b>乌托邦式接口和实现别离技术</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
《Imperfect C++》中展示了一种叫“螺栓”的技术,但是,这本书中的谈论并不充足深化.当然,我也相信Matthew是成心的,从而让我们这些“三道贩子”(Matthew自称是二道贩子)也可以得到一点点成就感.
考虑这样一个接口计划:
struct IRefCount;
struct IReader : public IRefCount;
在Reader中实现接口:
<!--[if !supportEmptyParas]--> class Reader : public IReader;
在上述的担当构造中,IRefCount是一个构造性的类,用来实现引用计数,实际上它和范畴逻辑部份IReader没有什么关系.我们打算在IRefCount的底子上,成立了一套工具来管理对象生命周期和帮忙实现非常安全的代码 (比方,smart pointer) .目前来考虑Reader的实现,Reader除了需求实现IReader的接口,还必须实现IRefCount的接口.这一切看起来仿佛顺理成章,让我们持续看下面的计划<!--[if !supportEmptyParas]-->:
struct IWriter : public IRefCount;
<!--[if !supportEmptyParas]--> class Writer : public IWriter;
目前来考虑Writer的实现,和Reader一样,Writer除了要实现IWriter的接口外,同时还需求实现IRefCount的接口.目前,我们来看看IRefCount是若何定义的:
struct IRefCount {
virtual void add() = 0;
virtual void release() = 0;
virtual int count() const = 0;
virtual void dispose() = 0;
virtual ~IRefCount(){}
};
在Reader中的IRefCount的实现:
virtual void add() { ++m_ref_count;}
virtual void release() {--m_ref_count;}
virtual int count() const{return m_ref_count;}
virtual void dispose() { delete this;}
…
int m_ref_count;
一样,在Writer的实现中,也包含了一模一样的代码,这违反了DRY原则(Don’t Repeat Yourself).何况,随着系统中的类增添,大家都意识到,需求将这部份代码复用.一个可以工作的做法是把IRefCount的实现代码直接放到IRefCount中去实现,通过担当,派生类就没必要再次实现IRefCount了.我们来看一下dispose的实现:
virtual void dispose() { delete this;}
这里,采取了delete来销毁对象,这就意味着Reader必须在堆上分配,才大概透过IRefCount精确管理对象的生命周期,不要紧,我们还可以override dispose办法,在Reader以下实现dispose:
virtual void dispose() { }
但是,这样又带来一个问题,Reader不能被分配在堆上了!假如你够狠,当然,你也可以这么办理问题:
class HeapReader : IReader;
class StackReader : HeapReader{ virtual void dispose() { } };
问题是,StackReader 是一个HeapReader吗?为了代码复用,我们完好不管什么概念了.当然,假如你和我一样,垂青保护概念,那么这么实现吧:
class HeapReader : IReader;
class StackReader : IReader;
这样一来,IReader的实现将被反复,又违反了DRY原则,等着被将来保护的工程师咒骂吧!大概,那个保护工程师就是3个月后的你自己.假如这样真的可以办理问题,那么也还是可以承受的,很快,我们有了一个新的接口:
struct IRWiter : IReader, IWriter;
class RWiter : public IRWiter;
考虑一下IRefCount的语义:它用来记录对所在对象的引用计数.很明显,我从IReader和IWriter中的肆意一个分支得到的IRefCount应当都是得到一样的引用计数效果.但是目前,这个担当树存在两个IRefCount的实例,我们不得不在RWiter当中重新重载一遍.这样,从IReader和IWriter担当来的两个实例就作废了,并且,我们大概还浪费了8个字节.为了办理这个问题,我们还可以在另一条危险的道路上持续行进,那就是虚拟担当:
struct IReader : virtual public IRefCount;
struct IWriter : virtual public IRefCount;
还记得大师们赐与的警告吗--“不要在虚基类中存放数据成员”.“这样有什么问题吗,我们没必要对大师盲目崇拜”,你一定也听过这样的倡议.假如大师们不能说服这些人,那么我也不能.于是,我们进一步在全部的接口中供应默许实现,包含IReader和IWriter.
以上是“<b>乌托邦式接口和实现别离技术</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |