当前位置: 首页 > 文档资料 > C++大学教程 >

9.11 关于继承的软件工程

优质
小牛编辑
137浏览
2023-12-01

我们可以用继承来定制现有的软件。为了把现有类定制成满足我们的需要的类,首先要继承现有类的属性和行为,然后添加和去除一些属性和行为。在C++中,派生类不必访问基类的源代码,但是需要能够连接到基类的目标代码。这种强大的功能对独立软件供应商(ISV)很有吸引力。

ISV开发出具有目标代码格式的类后,他们就拥有了这些类的所有权,因而可以销售和发放使用许可证。

用户拥有这些类后,在不必访问源代码(所有权属于ISV)的情况下,他们就能够从这些类库中派生出新的类,所有的ISV需要为目标代码提供头文件。

软件工程视点 9.6
理论上,用户不需要看到所继承类的源代码。但实际上,根据发放许可证的经验,客户通常会需要源代码。程序员似乎还是不大愿意放心地把别人编写的代码放进自己的程序中。

性能提示 9.1
如果性能是主要考虑,则程序员可能要浏览所继承类的源代码,以便根据性能要求调整代码。

学生们很难认识到大型软件项目的设计者和实现者所面临的问题。有过开发这种项目经验的人都知道缩短软件开发过程的关键是鼓励软件复用。面向对象的程序设计普遍鼓励软件复用,而C++尤其提倡软件复用。

正是继承了实用的类库才发挥出了软件复用的最大优势。随着人们对C++的兴趣不断增长,对类库感兴趣的人也将增加。正如个人电脑的出现带动了ISV生产的套装软件日益增长,C++也必将带动类库的建立和销售。因为应用程序设计者会用这些类库建立他们自己的应用程序,所以类库设计者也将因此而获得丰厚的报偿。当前随C++编译器分发的类库倾向于一定的通用性并限制使用范围。在世界范围内开发应用于各种领域的类库的时代正在来临。

软件工程视点 9.7
建立一个派派生类不会影响其基类的源代码和目标代码,继承这一机制保护了基类的完整性。

基类描述了共性。所有从基类派生出来的类都继承了基类的功能。在面向对象的设计过程中,设计者先寻求井提取出构成所需基类的共性,然后再通过继承从基类派生出超出基类功能的定制派生类。

软件工程视点 9.8
在面向对象的系统中,类常常是紧密相关的。提取出共同的属性和行为并把它们放在一个基类中,然后再通过继承生成派生类。

正如非面向对象系统的设计者力图避免不必要的函数一样,面向对象系统的设计者也应该避免不必要的类。多余的类不仅会带来类管理上的问题,而且会阻碍软件的复用。理由很简单,因为用户难以在巨大的类集合中定位某个类权。权衡的结果还是建立较少的类,每个类都实际增加一些功能。这样的类对于某些用户来说可能功能太丰富了一点,但是他们可以屏蔽掉多余的功能,然后使之满足自己的需要。

性能提示 9.2
大于功能需求的派生类可能会浪费内存和处理资源。因此应继承最接近要求的类。

注意,因为派生类中没有列出继承来的成员,所以浏览一组派生类的声明会令人迷惑,但是派生类中确实存在继承来的成员。

软件工程视点 9.9
派生类除了包含其基类的属性和行为外,还能够包含附加的属性和行为。继承机制能够使基类独立于派生类编译。为了把基类与派生类中增加的属性和行为组合成派生类,编译器只需要编译派生类中增加的属性和行为。

软件工程视点 9.10
只要基类的 public 接口不变,对基类的修改无需修改派生类,但是派生类需要重新编译。