【发布时间】:2016-12-26 11:39:39
【问题描述】:
我正在考虑用 C 语言实现一个简单的接口模式。
一个关键特性是它会为接口的公共标头提供的不透明结构提供多个定义,也就是说,不同的实现会为该结构提供不同的底层数据(因此在不同的翻译单元中,相同的结构会有不同的实施)。
我找不到任何关于这将是好的还是坏的设计模式的参考。至少它似乎没有违反严格的别名规则,只依赖于公共第一个元素的一致顺序和填充,这是由 C 标准保证的(据我所知)。当然,我知道 C 中面向对象的模式,但我看不到这个特定的模式。
这可以接受吗?甚至使用过这样的模式吗? (我找不到任何东西)
为了便于理解,以下是三个源文件的工作示例:
reader.h(公共接口定义)
#ifndef READER_H
#define READER_H
typedef struct reader_s reader_t;
char reader_read(reader_t* r);
#endif
reader.c(接口的粘合逻辑)
#include "reader.h"
typedef char (reader_f)(reader_t*);
struct reader_s{
reader_f* rfunc;
};
char reader_read(reader_t* r)
{
return r->rfunc(r);
}
reader1.h(接口的实现,头文件)
#ifndef READER1_H
#define READER1_H
#include "reader.h"
reader_t* reader1_get(void);
#endif
reader1.c(接口的实现,代码)
#include "reader1.h"
typedef char (reader_f)(reader_t*);
struct reader_s{
reader_f* rfunc;
int pos;
};
static char reader1_read(reader_t* r);
reader_t reader1_obj = {&reader1_read, 0};
reader_t* reader1_get(void)
{
return &reader1_obj;
}
static char reader1_read(reader_t* r)
{
char rval = 'A' + (r->pos);
(r->pos) = (r->pos) + 1;
if ((r->pos) == 24){ (r->pos) = 0; }
return rval;
}
main.c(使用示例)
#include "reader1.h"
#include <stdio.h>
int main(void)
{
reader_t* rd = reader1_get();
int i;
printf("\n");
for (i = 0; i < 60; i++){
printf("%c", reader_read(rd));
}
printf("\n");
return 0;
}
接口可能应该为实现者提供另一个头文件,提供包含函数指针的结构头的定义。也许它甚至可以指向一个包含那些以最小化具有许多方法的类的对象大小的类结构。
【问题讨论】:
标签: c struct opaque-pointers