1. 从点灯说起:为什么需要面向对象思想
记得刚学C语言那会儿,老师让我们用51单片机控制LED灯。最简单的代码是这样的:
c复制#include <reg51.h>
sbit LED = P1^0;
void main() {
while(1) {
LED = 0; // 点亮
delay(1000);
LED = 1; // 熄灭
delay(1000);
}
}
后来项目复杂了,要控制RGB三色灯,代码变成了这样:
c复制sbit RED = P1^0;
sbit GREEN = P1^1;
sbit BLUE = P1^2;
void setColor(int r, int g, int b) {
RED = r;
GREEN = g;
BLUE = b;
}
再后来要支持不同类型的灯(比如还有呼吸灯、流水灯),代码开始失控——到处都是if-else判断灯类型,修改一个功能要改十几处代码。这就是典型的"面条式代码",也是面向过程编程的痛点。
关键转折点:当系统需要管理多种相似但不同的硬件设备时,面向过程的代码会快速膨胀,变得难以维护。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用结构体实现封装:把灯"包"起来
封装的核心思想是"把数据和操作数据的方法打包"。在C语言中,我们用结构体+函数指针模拟:
c复制// 灯的基础结构体
typedef struct {
void (*turnOn)(void);
void (*turnOff)(void);
int status; // 状态变量
} Light;
// 具体LED灯的实现
void ledOn() { P1^0 = 0; }
void ledOff() { P1^0 = 1; }
// 构造函数
Light createLedLight() {
Light l;
l.turnOn = ledOn;
l.turnOff = ledOff;
l.status = 0;
return l;
}
现在使用灯只需要:
c复制Light myLight = createLedLight();
myLight.turnOn();
封装的优势:
- 隐藏实现细节(用户不需要知道灯接在P1.0口)
- 统一操作接口(所有灯都用turnOn/turnOff控制)
- 方便扩展(新增灯类型不影响现有代码)
3. 实现继承:从基础灯到RGB灯
继承的本质是"在已有类型基础上扩展新功能"。C语言通过结构体嵌套实现:
c复制// 基础灯结构体(父类)
typedef struct {
void (*turnOn)(void);
void (*turnOff)(void);
int status;
} Light;
// RGB灯结构体(子类)
typedef struct {
Ligh
