第十二课 顶层父类的创建

  我们学习数据结构,为什么要创建顶层父类呢?

    我们的目标是创建一个可复用的数据结构类库,可复用指的就是在不同的工程里面,我们可以使用本次创建的数据结构库,在不同的编译器、不同的工程、不同的背景下使用这个库都是可以的。既然涉及到了工程应用,我们就需要考虑在当今的软件架构方法中是如何创建一个库的。

当代软件架构实践中的经验:

  尽量使用单重继承的方式进行系统设计,不要使用多继承,可以使用多个接口。不要让一个类继承多个父类

  尽量保持系统中只存在单一的继承树,通过创建一个顶层的抽象父类来保证,我们要创建的DTLib要遵循这一条准则,使这个库只存在单一的继承树

  尽量使用组合关系代替继承关系

不幸的事实:

  C++代码的灵活性使得代码中可以存在多个继承树

  C++编译器的差异使得同样的代码可能表现不同的行为,例如new操作失败会发生什么?

    古代的编译器在new失败时会返回一个空指针,而现代的编译器在new失败时会抛出一个标准库中的异常。

  不同的行为给我们创建库带来了挑战,如果new失败了,我们在库里怎么处理?既然是一个复用库,我们不能假设使用的编译器的类型,我们希望在任何编译器中new都有相同的行为。

创建DTLib::Object类的意义

  遵循经典的设计准则,所有数据结构都继承自Object类,这样就保证了单一的继承树

  定义动态内存申请的行为,提高代码的移植性。我们自己来规范动态内存申请时候的行为,不使用编译器默认提供的new的行为,我们自定义一个行为,这样就可以保证不同的编译器中的行为是一致的

顶层父类接口定义:

   顶层父类中需要重载new和delete操作符,重载它们的意义在于,我们希望new或者delete这个库中的类对象时,有我们期望的行为,并且这个行为在不同的编译器下都是相同的。此外,将析构函数定义为纯虚函数,这样可以使得顶层父类是一个抽象类,这样的析构函数定义也可以保证这个类的所有子类当中都有虚函数表的指针了,这就可以让我们使用动态类型识别相关的技术了。

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9500360.html