c - 人们使用什么技术/策略在 C(不是 C++)中构建对象?

标签 c inheritance object c99 c89

我对旨在从 C 中使用的对象特别感兴趣,而不是构成解释语言(如 python)核心的对象的实现。

最佳答案

我倾向于做这样的事情:

struct foo_ops {
    void (*blah)(struct foo *, ...);
    void (*plugh)(struct foo *, ...);
};
struct foo {
    struct foo_ops *ops;
    /* data fields for foo go here */
};

有了这些结构定义,实现 foo 的代码看起来像这样:

static void plugh(struct foo *, ...) { ... }
static void blah(struct foo *, ...) { ... }

static struct foo_ops foo_ops = { blah, plugh };

struct foo *new_foo(...) {
   struct foo *foop = malloc(sizeof(*foop));
   foop->ops = &foo_ops;
   /* fill in rest of *foop */
   return foop;
} 

然后,在使用 foo 的代码中:

struct foo *foop = new_foo(...);
foop->ops->blah(foop, ...);
foop->ops->plugh(foop, ...);

此代码可以用宏或内联函数整理,因此看起来更像 C

foo_blah(foop, ...);
foo_plugh(foop, ...);

尽管如果您坚持为“ops”字段使用一个相当短的名称,那么简单地写出最初显示的代码并不是特别冗长。

此技术完全足以在 C 中实现相对简单的基于对象的设计,但它不能处理更高级的要求,例如显式表示类和方法继承。对于这些,您可能需要类似 GObject 的东西(如 EFraim 所述),但我建议确保您确实需要更复杂框架的额外功能。

关于c - 人们使用什么技术/策略在 C(不是 C++)中构建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1225844/

相关文章:

java - 如何将对象添加到对象数组列表中的数组列表?

c++ - 连接汇编和 C 问题

C 程序生成奇数输出

c# - 接口(interface)继承是一种不好的做法吗?

c# - 如何在基类对象上调用子类方法?

objective-c - 在 Objective-c 中,我如何制作一个所有子类都可以访问但不能公开访问的方法

java - 当通过单例模式创建可序列化对象时会发生什么?

c - Linux 上基于 C 的事件循环进程中的异步计时器

c - 有没有办法用指针+变量来遍历数组?

javascript - JavaScript 对象中的自引用是否会导致性能不佳?