文件名称:用组合代替继承-*重构*改善既有代码的设计(带完整书签)
文件大小:1.28MB
文件格式:PDF
更新时间:2024-06-27 17:56:08
C++ 编程规范
建议4.4 在析构函数中集中释放资源 说明:使用析构函数来集中处理资源清理工作。如果在析构函数之前,资源被释放(如release函数), 请将资源设置为NULL,以保证析构函数不会重复释放。 4.3 继承 继承是面向对象语言的一个基本特性。理解各种继承的含义:“public继承”意味"是...一个",纯虚 函数只继承接口,一般的虚函数继承接口并提供缺省实现,非虚函数继承接口和实现但不允许修改。 继承的层次过多导致理解困难;多重继承会显著增加代码的复杂性,还会带来潜在的混淆。 原则4.4 用组合代替继承 说明:继承和组合都可以复用和扩展现有的能力。如果组合能表示类的关系,那么优先使用组合。 继承实现比较简单直观,但继承在编译时定义,无法在运行时改变;继承对派生类暴露了基类的实现 细节,使派生类与基类耦合性非常强。一旦基类发生变化,派生类随着变化,而且因为派生类无法修 改基类的非虚函数,导致修改基类会影响到各个派生类。 而组合的灵活性较高,代码耦合小,所以优先考虑组合。 但是并非绝对,往往组合和继承是一起使用的,例如组合的元素是抽象的,通过实现抽象来修改组合 的行为。 继承在一般情况下有两类:实现继承(implementation inheritance)和接口继承(interface inheritance),尽可能不要使用实现继承而考虑用组合替代。 接口继承:只继承成员函数的接口(也就是声明),例如纯虚(pure virtual)函数;实现继承:继 承成员函数的接口和实现,例如虚函数同时继承接口和缺省实现,又能够覆写它们所继承的实现;非 虚函数继承接口,强制性继承实现。 示例:组合是指一个类型嵌入另一个类型的成员变量,即"有一个" 或 "由...来实现"。例如: class Address{ ... }; //某人居住之处 class PhoneNumber{ ... }; //某人电话号码 class Person