//
前言
面向对象的java语言有着多种设计模式与特性。比如封装、继承、多态等等。
在这篇文章中,我会使用java的代码思路,实现C语言版的JAVA三大特性。
并从写代码的角度,从0开始构建。
定义结构体(对象)
设计了一个机器人结构体(对象)。
机器人有他的ID,这是他的静态特征,是主键。
机器人有制造商,不光机器人有,所有工业产品都有。
机器人有许多行为,跑、跳、检查修理日期等等。
机器人有许多内设动作,就是预设将不同行为进行排列组合。
继承
机器人是工业产品的子类,即机器人继承了工业产品。
体现在代码上就是结构体的嵌套
封装
将机器人的所有特征、行为、内置动作封装在一起。
体现在代码上就是结构体里有变量和函数指针。
typedef struct _Manufacturer {
char name[10];
} Manufacturer;
typedef struct _robot
{
int id;
Manufacturer manufacturer; // inherit
void (*function)(struct _robot ); // polymorphic
int (*time2repair)(struct _robot);
void (*process)(struct _robot );
} Robot;
多态
机器人结构体(对象)中有功能函数指针function和维修函数指针time2repair。
定义函数robot_run_function,robot_jump_function,实现function功能。
定义函数robot_time2repair,实现time2repair功能。
void robot_run_function(Robot robot) {
printf("robot_id: %d, run!\n", robot.id);
}
void robot_jump_function(Robot robot) {
printf("robot_id: %d, jump!\n", robot.id);
}
int robot_time2repair(Robot robot) {
printf("robot_id: %d, need to repair next weekend!\n", robot.id);
return 9;
}
定义函数process1,实现process功能(暂时不写)
void process1(Robot robot)
{
// 进程1:先跑2次,再跳1次,最后计算修理日期
}
初始化机器人结构体(对象)。将process1赋给函数指针process,调用process。
int main() {
Robot robot;
Manufacturer manufacturer;
strcpy(manufacturer.name, "SKF");
robot.id = 2;
robot.manufacturer = manufacturer;
robot.process = process1;
robot.process(robot);
return 0;
}
最后实现process1,思路仍然是将函数赋给函数指针并调用。
void process1(Robot robot)
{
// 进程1:先跑2次,再跳1次,最后计算修理日期
robot.function = robot_run_function;
robot.function(robot);
robot.function(robot);
robot.function = robot_jump_function;
robot.function(robot);
robot.time2repair = robot_time2repair;
int remain_days = robot.time2repair(robot);
printf("manufacturer: %s, id: %d, remain_days: %d\n", robot.manufacturer, robot.id, remain_days);
}
打印结果
robot_id: 2, run!
robot_id: 2, run!
robot_id: 2, jump!
robot_id: 2, need to repair next weekend!
manufacturer: SKF, id: 2, remain_days: 9