C中的方法查找

时间:2016-08-13 01:52:11

标签: c lookup

我试图使用OOP在C中制作游戏。我遇到了能够在超类中查找方法的问题。

目前,我的物品或多或少看起来像这样:

typedef unsigned int PTR

struct Object{
    PTR super;
    PTR (method1 (PTR self, ...));
    .
    .
    .
    PTR (methodN (PTR self, ...));
}

我想查找一个方法,如果在某个对象中找不到它,可以在它的超级中迭代地查找它,它是超级超级等等,如果super == NULL在某个时刻返回0(找不到方法)。

我怎么能实现这个目标?

2 个答案:

答案 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。在调用方法时添加另一个间接,但在构造函数中保存了大量初始化代码,因为只有在第一次实例化特定类的实例时才需要这样做。&