网站大量收购闲置独家精品文档,联系QQ:2885784924

对象关系的设计与C++实现规则.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
对象关系的设计及C++实现规则 一:设计时可以使用的关系 1、继承 2、关联 3、包含 二:关联和包含(聚集)关系的设计约束 1、对于关联关系可以使用一对一、一对多、多对多; 2、对于包含关系可以使用一对一、一对多; 3、对于关联关系可以使用双向导航,也可以使用单向导航; 4、对于包含关系可以使用双向导航,也可以使用从整体到部分的单向导航; 5、对于关联和包含,可导航端(ROLE)必须命名,非导航端不要命名; 6、对于关联关系,单向导航适用于在运行过程中导航端保持不变的类。如下图中的关联(1-N),如果A-B之间的关联经常发生变化,特别是B的实例被删除的情况,将有可能导致没有通知A,最终发生非法引用的情况;当然如果不使用引用来标示则是允许的(如通过关键域值来标示对端),但要记住标示可能会代表一个无效的关联。 7、对于包含关系,只允许从整体端到部分端的单向导航,并且要保证所有对于部分端的删除操作都是通过整体端来实现的; 8、尽量不使用多重继承。 三:对于关联和包含关系的实现: 无论是关联关系还是包含关系,关系的两端可以分别作为对端的属性,该属性具有私有的属性,对类外部提供包括查找、遍历的函数接口;如图中,A类有一个roleB的属性,B类有一个roleA的属性。 1、对于关联,一端的实现方式可以是引用(指针),多端的实现方式可以是引用链表、引用数组或hash表。 2、对于包含,包含关系的整体端(A)的实现方式可以是引用(如上图包含关系中,B中有一个pRoleA的属性)。包含关系的部分端(B)如果是一端的,实现方式可以是引用,或者直接是值(A类直接包含一个B的实例),如果是多端的则可以通过引用链表、引用数据或hash表来实现。 3、无论是关联还是包含关系,对于一端如果使用指针方式,建议角色命名的时候前缀为p,否则不带前缀。对于多端,则通过后缀表示实现方式,带List后缀表示使用链表实现,带Array后缀表示使用数组实现,带Map后缀表示使用hash表实现。对于通过Map方式实现的需要有关键值的说明。 4、对于某些特殊情况,如果不能够通过引用实现,可以通过关键域值方式实现,表示方法如上图。在使用关键域值的时候要保证关键域值的唯一性(一个关键域值只能与唯一一个实例对应,包含B实例的容器类要提供基于关键域值查找实例的查找方法)。但要注意一点,如果B的实例是可以动态创建并删除的,有可能发生通过关键域值无法找到对应的实例的情况。 普通关联关系的实现规则 1、一对一双向导航关联实现规则 ClassA ClassB 关系名称:RelationAB 角色A名称: RoleA 角色B名称 :RoleB 定义如下: ClassA { private: ClassB* m_pRoleB; public: ~ClassA() //析构函数指导写法 { ...... if( m_pRoleB ) m_pRoleB-DisassociateXZAndY(this, FALSE) ...... } BOOL AssociateXYAndZ(ClassB* pRoleB,BOOL bDirection=TRUE) //X为关系名称;Y为角色A名称;Z为角色B名称 //bDirection表示在执行本端Associate操作是否执行对端的Associate操作 //后同此注释 { ASSERT(pRoleB); if( pRoleB == NULL ) return FALSE; if( m_pRoleB ) // 如果有老关系, 要先清除 DisassociateXYAndZ(m_pRoleB); m_pRoleB = pRoleB; if (pRoleB) pRoleB-AssociateXZAndY( this, FALSE); return TRUE; } BOOL DisassociateXYAndZ(ClassB* pRoleB,BOOL bDirection=TRUE) { ASSERT(pRoleB==m_pRoleB); if( m_pRoleB != pRoleB ) return FALSE; m_pRoleB = null ; if (bDirection) pRoleB-DisassociateXZAndY(this,FALSE); return TRUE; } ClassB* GetZ(void) { return m_pRoleB ; } } Cla

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档