深入理解聚合、组合与关联:概念、实现与应用
1. 组合的替代实现方式:继承
通常,组合会使用嵌入式对象来实现,但继承也能作为另一种实现组合的方式,不过这种做法存在很大争议。继承一般用于实现 “Is - A” 关系,而非 “Has - A” 关系。当使用继承实现 “Has - A” 关系时,只需从部分类继承,而非将部分类作为数据成员嵌入。这样就无需像嵌入式对象示例那样提供包装函数。例如,在之前的程序中, Student::GetStudentId() 方法调用 studentId.GetId() 来访问嵌入部分,这是因为部分( Id )在整体( Student )中是私有的。而使用继承时, Id::GetId() 的公共接口会直接作为 Student 的公共接口被继承,无需显式通过嵌入式对象访问。
不过,继承部分类虽然在某些方面简单,但会极大地加剧多重继承的复杂性,且整体只能包含每个部分的一个实例,不能有多个相同部分。此外,用继承实现整体 - 部分关系与面向对象设计对比时可能会让人困惑,因为继承通常意味着 “Is - A” 而非 “Has - A”。因此,聚合最典型和受认可的实现方式仍是嵌入式对象。
2. 广义聚合的定义与实现
在面向对象设计中,组合是最常用的聚合形式,在组合里,部分离开整体就没有存在的意义。但存在一种更广义(但不太常见)的聚合形式,在广义聚合中,部分可以独立于整体存在。部分会先单独创建,然后在某个时间点与整体关联。当整体消失时,部分可以保留并用于其他整体对象。 <
超级会员免费看
订阅专栏 解锁全文
6307

被折叠的 条评论
为什么被折叠?



