面向对象编程——类与对象
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 通用校验器使用范例程序
由此可见,虽然在结构体内置函数指针也可以创建类,但其中的每个类都是一个独立的单元,每个都要从头开始。且不同类之间没有任何关系,因为每个类的开发者都根据自己的选择提供方法。
对象 相关文章:
- 面向对象编程——OO思想(08-27)