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

面向对象编程——类与对象

时间:08-27 来源:ZLG致远电子 点击:

en()函数接口的实现详见程序清单 4.4。

程序清单 4.4 偶校验器接口函数的实现

显然,无论是什么校验器,其共性是value值合法性判断,因此可以共用一个函数指针,即特殊的函数指针类型RangeValidate和OddEvenValidate被泛化成了一般的函数指针类型Validate。其次,由于每个函数都有一个指向当前对象的pThis指针,因此特殊的结构体类型RangeValidator *和OddEvenValidator *被泛化成了void *类型,即可接受任何类型的数据:

校验器泛化接口的实现详见程序清单 4.5。

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

为了便于阅读,程序清单 4.6展示了范围值校验器和奇偶校验器的接口。

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

这个接口主要由所有的操作声明构成,这些操作适用于这个类的所有对象,详见图 4.3。

图 4.3 类图

以范围值校验器为例,假设min=0,max=9,使用名为newRangeValidator的宏将结构体初始化的使用方法如下:

注意,RangeValidator类是在编译时定义的,而rangeValidator对象是在运行时作为类的实例创建的。宏展开后如下:

其相当于:

如果有以下定义:

即可通过pValidator引用RangeValidator的min和max。校验函数的调用方式如下:

以上调用形式的前提是已知pValidator指向了确定的结构体类型,如果pValidator将指向未知的校验器,显然以上调用形式无法做到通用,那么如何调用?

虽然pValidator与&rangeValidator.validate的类型不一样,但它们的值相等,因此可以利用这一特性获取validateRange()函数的地址。即:

其调用形式如下:

根据OCP开闭原则,由于不允许修改push()函数,因此需要编写一个通用的扩展push功能的pushWithValidate()函数,详见程序清单 4.7。

程序清单 4.7 pushWithValidate()

其中,stack是指向当前对象(栈)的指针,用于请求对象对自身执行某些操作,而结构体的成员变量就是通过stack指针找到自己所属的对象的。pValidator为指向校验器的指针,如果无需校验,则将pValidator置NULL并返回true。

使用validator.h接口的通用校验器范例程序详见程序清单 4.8。

程序清单 4.8 通用校验器使用范例程序

由此可见,虽然在结构体内置函数指针也可以创建类,但其中的每个类都是一个独立的单元,每个都要从头开始。且不同类之间没有任何关系,因为每个类的开发者都根据自己的选择提供方法。

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

网站地图

Top