-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathinterface_example.c
91 lines (76 loc) · 2.56 KB
/
interface_example.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
接口是一种抽象方法的集合,与类属于不同的概念。类描述对象的属性和方法,接口则定义类需要实现的方法。
接口和抽象类有点像,都是一种抽象类型,但两者很大不同。
抽象类是对一种事物整体的抽象,即对类抽象,包括属性、行为等,子类和抽象类是一种"is-a"的关系。
而接口是对行为的抽象,是对类局部(行为)进行抽象,接口表示一种"can-do"的关系。
抽象类作为子类的父类,它是一种模板式设计。接口是一种行为规范,它是一种辐射式设计。
c语言没有interface,可以用struct模拟。
本示例:
- Door接口定义了门的基本行为:打开和关闭。
- Alarm接口定义了报警器的行为:触发报警。
- AbstractAlarm抽象类实现了Alarm接口,提供了一个空的trigger()方法,具体的报警器类可以通过覆盖这个方法来实现具体的报警逻辑。
- SecurityDoor类实现了Door接口,并继承了AbstractAlarm类,表示一种既可以打开和关闭的门,又具有报警功能。
通过这种设计,我们实现了门和报警器的分离,并且可以轻松地扩展系统以支持其他类型的门和报警器,而不需要修改现有的代码。
*/
#include <stdio.h>
#include <stdlib.h>
// 定义门接口
typedef struct
{
void (*open)();
void (*close)();
} Door;
// 定义报警器接口
typedef struct
{
void (*trigger)();
} Alarm;
// 抽象类:AbstractAlarm,实现了报警器接口
typedef struct
{
Alarm alarm;
} AbstractAlarm;
void trigger_abstract_alarm()
{
// 空方法体,具体报警器实现时需覆盖该方法
}
// 实现安全门类,继承报警抽象类,同时实现了门接口和报警器接口
typedef struct
{
Door door;
AbstractAlarm abstract_alarm;
} SecurityDoor;
void open_door()
{
printf("安全门打开\n");
}
void close_door()
{
printf("安全门关闭\n");
}
void trigger_security_door()
{
printf("警报触发! 有一条安全告警。\n");
}
int main()
{
// 创建安全门对象
SecurityDoor security_door;
security_door.door.open = open_door;
security_door.door.close = close_door;
security_door.abstract_alarm.alarm.trigger = trigger_security_door;
// 打开门
security_door.door.open();
// 关闭门
security_door.door.close();
// 触发报警
security_door.abstract_alarm.alarm.trigger();
return 0;
}
/*
jarry@jarrys-MacBook-Pro interface % gcc interface_example.c
jarry@jarrys-MacBook-Pro interface % ./a.out
安全门打开
安全门关闭
警报触发! 有一条安全告警。
*/