Statement
将是一个struct
. 除了它的数据成员之外,您还需要一个函数指针,例如
struct Statement
{
void(*exec)(Statement* this); // Function pointer
// Other members
};
然后,您将拥有每个语句类型的函数的不同实现以及用于制造正确类型的对象的函数,例如
static void printExec(struct Statement* this)
{
printf("%s", this->whatever);
}
struct Statement* createPrintStatement()
{
struct Statement* statement = calloc(1, sizeof(struct Statement));
statement->exec = printExec;
return statement;
}
你会像这样调用它:
statement->exec(statement);
this
指针使您可以访问特定结构的数据成员,即您调用其 exec 方法的实例。
如果您有很多功能,请考虑使用 vtable。
struct VTable
{
void(*exec)(Statement* this); // Function pointer
const char* (*stringValue)(Statement* this); // Function pointer
};
struct Statement
{
struct VTable* vtable;
// Other members
};
您只为每种对象构建一个 vtable 一次
struct VTable printVTable =
{
printExec,
printStringValue
};
您可以这样创建新对象:
struct Statement* createPrintStatement()
{
struct Statement* statement = calloc(1, sizeof(struct Statement));
statement->vtable = &printVTable;
return statement;
}
并调用这些方法
statement->vtable->exec(statement);
vtable 方法或多或少是 C++ 在幕后所做的。