微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 面向对象编程——继承与多态

面向对象编程——继承与多态

时间:09-20 来源:ZLG致远电子 点击:

果在编写新的类时,还要重用基类代码代码,则要考虑使用组合。

和继承一样,组合也是一种构建对象的机制。如果新类可以替换已有的类,且它们之间的关系可以描述为is-a,则使用继承。如果新类只是使用已有的类,且它们之间的关系可以描述为has-a,则使用组合。相对继承来说,组合更加灵活,适用性也更强。

有关组合的使用方法和示例,将在后续相关的教程中,结合具体的应用予以阐述。

在这里,RangeValidator和OddEvenValidator类扩展了(即继承)Validator,其相应的校验器接口的实现详见程序清单 4.9。

程序清单 4.9 通用校验器接口的实现(Validator.c)

由此可见,抽象是一个强大的分析工具,其强调的什么是共同的,因此共性和差异化分析自然而然地成为了抽象的理论基础。共性分析寻找的是不可能随时间而改变的结构,而可变性分析则要找到可能变化的结构。如果变化是"业务领域"中各个特定的具体情况,那么共性就定义了业务领域中将这些情况联系起来的概念。共同的概念用抽象类表示,可变性分析所发现的变化将通过从抽象类派生而来的具体类实现。共性与可变性分析工具不仅可以指导我们创建抽象类和派生类,而且还可以指导我们建立抽象和接口。那么类的设计过程自然而然地就简化成了两个步骤:

  • 在定义抽象类(共性)时,需要知道用什么接口处理这个类的所有职责;

  • 在定义派生类(可变性)时,需要知道对于一个给定的特定实现(即变化),应该如何根据给定的规约实现它。

显然,类是一种编程语言结构,它描述了具有相同职责的所有对象。用相同的方式实现这些职责,并共享相同的数据结构。虽然它的内部可能有一些属性,可能有一些方法,但我们只关心对象对自己的行为负责。因为将实现隐藏在接口之后,实际上是将对象的实现和使用它们的对象彻底解耦了。所以只要概念不变,请求者与实现细节的变化隔离开了。

为了便于阅读,程序清单 4.10展示了通用校验器的接口。

程序清单 4.10 通用校验器的接口(validator.h)

在这里,还是以范围值校验器为例,假设min=0,max=9,如程序清单 4.10(22)所示的使用名为newRangeValidator的宏将结构体初始化的使用方法如下:

宏展开后如下:

其中,外面的{}为RangeValidator结构体赋值,内部的{}为RangeValidator结构体的成员变量isa赋值。即:

如果有以下定义:

即可用pValidator引用RangeValidator的min和max。

由于pValidator与&rangeValidator.isa不仅类型相同,而且它们的值相等,则以下关系同样成立:

因此可以利用这一特性获取validateRange()函数的地址,即pValidator->validate指向validateRange()。其调用形式如下:

此时此刻,也许你会想到,既然它们的方法都一样,只是属性不同,为何不将它们合并为一个类呢?如果这样做的话,则一个类承担的职责越多,它被复用的可能性就越小。而且一个类承担的职责过多,就相当于将这些职责耦合在一起。当其中一个职责变化时,可能会影响其它职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中。如果多个职责总是同时发生变化的话,则可以将它们封装在同一个类中。

也就是说,就一个类而言,应该只有一个引起它变化的原因,这就是单一职责原则,它是实现高内聚、低耦合的指导方针。这是最简单也最难运用的原则,需要开发人员发现类的不同职责并将其分离。

>>>   4.3.4 多态性

多态性是面向对象程序设计的一个重要特征,多态(函数)的字面含义是具有多种形式。每个类中操作的规约都是相同的,而这些类可以用不同的方式实现这些同名的操作,从而使得拥有相同接口的对象可以在运行时相互替换。

当向一个对象发送一个消息时,这个对象必须有一个定义的方法对这个消息作出响应。在继承层次结构中,所有子类都从其超类继承接口。由于每个子类都是一个单独的实体,它们可能需要对同一个消息作出不同的响应。比如,Validator类和行为validate。

在面向对象的编程中,真正引用的是从抽象类派生的类的具体实例。当通过抽象引用概念要求对象做什么时,将得到不同的行为,具体行为取决于派生对象的具体类型。因此,为了描述事物之间相同特性基础上表现出来的可变性,于是多态就被创造出来了,多态允许用相同的方法(代码)处理不同行为的对象。

多态是一种运行时基于对象的类型发生的绑定机制,通过这种机制实现函数名绑定到函数具体实现代码的目的。当执

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top