《程序设计与数据结构》——什么是类?
求?validateOddEven()函数接口的实现详见程序清单 2.21。
程序清单 4.4 偶校验器接口函数的实现
1 bool validateOddEven(OddEvenValidator *pThis, int value)
2 {
3 return (!pThis -> isEven && (value % 2)) || (pThis -> isEven && !(value % 2));
4 }
显然,无论是什么校验器,其共性是value值合法性判断,因此可以共用一个函数指针,即特殊的函数指针类型RangeValidate和OddEvenValidate被泛化成了一般的函数指针类型Validate。其次,由于每个函数都有一个指向当前对象的pThis指针,因此特殊的结构体类型RangeValidator *和OddEvenValidator *被泛化成了void *类型,即可接受任何类型的数据:
1 typedef bool(*const Validate)(void *pThis, int value);
2 typedef struct{
3 Validate validate;
4 const int min;
5 const int max;
6 }RangeValidator;
7
8 typedef struct{
9 Validate validate;
10 bool isEven;
11 }OddEvenValidator;
校验器泛化接口的实现详见程序清单 2.22。
程序清单 4.5 通用校验器接口的实现(validator.c)
1 #include "validator.h"
2
3 bool validateRange(void *pThis, int value)
4 {
5 RangeValidator *pRangeValidator = (RangeValidator *)pThis;
6 return pRangeValidator -> min <= value && value <= pRangeValidator -> max;
7 }
8
9 bool validateOddEven(void *pThis, int value)
10 {
11 OddEvenValidator *pOddEvenValidator = (OddEvenValidator *)pThis;
12 return (!pOddEvenValidator -> isEven && (value % 2)) ||
13 (pOddEvenValidator -> isEven && !(value % 2));
14 }
为了便于阅读,程序清单 4.6展示了范围值校验器和奇偶校验器的接口。
程序清单 4.6 通用校验器接口(validator.h)
1 #pragma once;
2 #include
3
4 typedef bool(*const Validate)(void *pThis, int value);
5 typedef struct{
6 Validate validate;
7 const int min;
8 const int max;
9 }RangeValidator;
10
11 typedef struct{
12 Validate validate;
13 bool isEven;
14 }OddEvenValidator;
15
16 bool validateRange(void *pThis, int value);
17 bool validateRange(void *pThis, int value);
18 #define newRangeValidator(min, max) {(validateRange), (min), (max)} // 初始化RangeValidator
19 #define newOddEvenValidator(isEven) {{validateOddEven}, (isEven)} // 初始化OddEvenValidator
这个接口主要由所有的操作声明构成,这些操作适用于这个类的所有对象,详见图 4.3。
图 4.3 类图
以范围值校验器为例,假设min=0,max=9,使用名为newRangeValidator的宏将结构体初始化的使用方法如下:
RangeValidator rangeValidator = newRangeValidator(0, 9);
注意,
周立功 相关文章:
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)