当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .