我试图使用OOP在C中制作游戏。我遇到了能够在超类中查找方法的问题。
目前,我的物品或多或少看起来像这样:
typedef unsigned int PTR
struct Object{
PTR super;
PTR (method1 (PTR self, ...));
.
.
.
PTR (methodN (PTR self, ...));
}
我想查找一个方法,如果在某个对象中找不到它,可以在它的超级中迭代地查找它,它是超级超级等等,如果super == NULL
在某个时刻返回0(找不到方法)。
我怎么能实现这个目标?
答案 0 :(得分:2)
您可以使用简单的循环实现它:
typedef PTR (*MPTR)();
MPTR lookup_method1(struct Object obj) {
MPTR res;
do {
res = obj->method1;
obj = obj->super;
} while (!res && obj);
return res;
}
循环遍历继承层次结构的链接,直到找到适当的方法。
但是,你的方法相当慢。您应该首先遍历层次结构,并将所有NULL
设置为来自父级的指针。通过这种方式,您可以快速查找;如果指针是NULL
,则没有实现。
答案 1 :(得分:0)
一种常见的方法不是在超类中搜索实现,而是在派生类中包含超类的方法表。为您省去了很多麻烦:
typedef struct SUPER {
int attribute1;
int attribute2;
int (*method1)(struct SUPER *self, int arg1, int arg2);
int (*method2)(struct SUPER *self, char *ptr);
} SuperClass_t;
typedef struct SUB {
struct SUPER superclass;
int (*method3)(struct SUB *self);
} SubClass_t;
在派生类中查找超类实现很容易:
// Call superclass method
void subClassMethod (SubClass_t *self, char *ptr){
self->superclass->method2 (&(self->superclass), ptr);
}
如果您希望它更接近“真正的”OOP语言,请不要将方法指针存储在实例中,而应该间接指向实际持有方法指针的所有实例共享的VMT。在调用方法时添加另一个间接,但在构造函数中保存了大量初始化代码,因为只有在第一次实例化特定类的实例时才需要这样做。&