一点五编程(二)补充说明及构建细节

一点五编程 细节补充

在interface接口层的设计中 所有的形参都是void*类型 指代任何结构体,在硬件实现层时形参为该硬件结构体的实例

typedef int (*light_on_fn_t)(void* self);
typedef int (*light_off_fn_t)(void* self);
struct light_i
{
    light_on_fn_t light_on;
    light_off_fn_t light_off;
};
上面时接口层.函数的形参为void *self
int io_led_on(struct io_led* self);
int io_led_off(struct io_led* self);

struct light_i io_led_interface = {
        .light_on = (light_on_fn_t) io_led_on,
        .light_off = (light_off_fn_t) io_led_off,
};
上面时io_led硬件实现层,形参时struct io_led* self

通过(light_on_fn_t) io_led_on强制转换 将硬件结构体传入接口函数内

接口函数封装

在struct工程中 没有将接口进行封装 虽然实现了(*p)->f§的效果 但使用的时候不够直观 看起来比较抽象

static inline int light_on(void* self)
{
    return (*(struct light_i**)self)->light_on(self);
}
static inline int light_off(void* self)
{
    return (*(struct light_i**)self)->light_off(self);
}
static inline int light_get_status(void* self)
{
    return (*(struct light_i**)self)->light_get_status(self);
}
在接口层中light.h将函数进行封装 可以看到在返回return里面是(*p)->f(p)
这里封装的时候时在接口层light.h中进行封装 其形参是void *self
所以该函数可以通用,实现多态的效果.
其真正实现的接口函数 根据传入的形参地址去找寻

实现效果如下

// 定义两个结构体
struct light_i {
    void (*light_open)(struct light_i *self);
    void (*light_close)(struct light_i *self);
};

struct io_led {
    struct light_i interface;  // 必须位于结构体的开始位置
    int status;
    const char *name;
};

// 创建一个 io_led 实例
struct io_led light1;
struct io_led light2;

//调用统一接口函数 如on、off、open、close
light_on(light1);
light_off(light2);
delay(100);

light_off(light1);
light_on(light2);
delay(100);

使用者是二重指针 实现者是一重指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

注意沈题!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值