- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- 自然辩证法-考试题库.doc
- 妇产科会阴擦洗冲洗护理技术.pptx
- 工程安全应急与响应预案.docx VIP
- Roland罗兰乐器JUNO-Gi 带数字录音功能的便携合成器JUNO-Gi Workshop 04 Realtime Control in the JUNO-Gi支持文档.pdf
- 《压疮压力性损伤的预防和治疗临床实践指南》解读.docx VIP
- 无热吸附式干燥机.doc
- 超星网课《中国古典小说巅峰-四大名著鉴赏》超星尔雅答案2023章节测验答案.doc
- 颊针疗法(基础篇).pptx
- 班会育人-心理健康课件——家校社协同育人,共创美好未来.pptx
- 同桌小伙伴(教学设计)-2024-2025学年岭美版(2024)美术一年级上册.docx VIP
文档评论(0)