类间关系:组合/委托/继承
Composition 组合(has-a)
- Container has a Component: Component 类 功能很全面,Container 类根据需要设计对外接口,实现全部在 Component 类中。
- 内存:Container 对象的内存中,包含一块 Component 的内存; 由内而外构造,由外而内析构.
Delegation 委托(Composition by reference)
- Handle reference Body:所有实现都在 Body 类中完成;Handle 根据需要设计对外接口,通过调用 Body 的方法实现
- 内存分布:Handle 类有一块内存,存放 Body 类对象的内存地址
- Delegation 的优点:
- 信息隐藏
包含 Handle 类所在的头文件,不仅成员函数实现不可见,类中实际的数据成员也不可见,很好的实现了信息隐藏。 - 编译防火墙
修改 Body 类,包含 Handle 类头文件的所有源文件都不需要重新编译,只需要编译 Body 类所在的源文件。在大工程中,可以有效的减少编译时间。 - Copy on write
Body 类增加引用计数字段,多个 Handle 类的对象可以引用同一个 Body 对象,某个 Handle 对象需要改变 Body 对象的数据成员时,Copy 一份副本供其修改。如果类 size 很大,可以减少内存使用。
- 信息隐藏
Inheritance 继承(is-a)
- 内存分布:子类对象的内存中,包含一块父类对象;由内而外构造,由外而内析构
- 哪些成员可以被继承?哪些不能继承?
- 数据成员都被继承
- 友元关系不能继承
- 非虚成员函数。子类可以覆写(override)
- 虚函数,子类可以重写
- 纯虚函数,子类必须实现 (父类可以定义)
- 价值在于,与虚函数搭配使用,实现多态
Inheritance with virtual
- Template Method:父类的成员函数实现应用程序框架(处理流程),将子类中不同的步骤定义为虚函数,子类重写。
- 优点:代码重用,子类只需要实现与父类不同的部分,其他部分可以使用父类的实现。
Inheritance + Composition
- Observer:解决一份数据多种表现形式问题。
- Composite:嵌套 has-a 的形式。
- Prototype:框架已经写好,框架中会创建子类对象,但是未知子类可能很长时间以后才会定义。
网友评论