这似乎在ANSI C OO是不是今天OO偏爱的方式。 有谁知道的方式使用严格的ANSI C,所以我可以证明给朋友,它可以编写一个简单的设计模式?(阿克塞尔 - 托比亚斯Schreiners的书让我去上这个!)
Answer 1:
OO用C的确可以使用函数指针作为解释的很好实现这太问题 。
使用从该职位的信息,这里是我将如何实现使用基本继承在C战略模式。
允许使用以下C ++作为指导:
class StrategyBase
{
...
StrategyBase();
virtual void strategyMethod() = 0;
...
};
class StrategyDerived
{
...
StrategyDerived();
void strategyMethod();
...
};
这里是对应的C代码:
typedef struct StrategyBase_t StrategyBase;
struct StrategyBase_t
{
StrategyBase *base; /* must be first memeber */
void (*strategyMethod)(const void *self);
};
StrategyBase *newStrategyBase();
void strategyMethod(const void *self); /* the abstract method */
struct StrategyDerived
{
StrategyBase *base; /* must be first memeber */
void (*strategyMethod)(const void *self);
/* more derived attributes here */
};
typedef struct StrategyDerived_t StrategyDerived;
StrategyDerived *newStrategyDerived();
这里是函数的实现:
void strategyMethod(const void *self)
{
/* If called with just a StrategyBase, strategyMethod will be NULL, *
* so perhaps some sort of protection should be added here first */
((StrategyBase*) self)->base->strategyMethod();
}
void strategyMethodDerived(const void *self)
{
/* Put your implementation here */
}
/* StrategyBase constructor */
StrategyBase *newStrategyBase()
{
StrategyBase *self = (StrategyBase*) malloc(sizeof(StrategyBase));
self->base = self; /* See comment below about virtual table */
self->strategyMethod = NULL; /* StrategyBase is abstract, right? */
return self;
}
/* StrategyDerived constructor */
StrategyDerived *newStrategyDerived()
{
StrategyDerived *self = (StrategyDerived*) malloc(sizeof(StrategyDerived));
self->base = newStrategyBase();
self->strategyMethod = self->base->strategyMethod = strategyMethodDerived;
return self;
}
虚表的实现是很基本的,但应该工作。 理想的情况是,一些更强大的应予执行。
然后,你只需要使用一个指针StrategyBase中,需要一个战略一个结构,有你有一个策略模式实现在C.我还没有尝试编译它,但是这应该作为一个很好的起点。
Answer 2:
有没有什么不可以; 而不是类Foo
,使用一个struct foo
; 而不是一个构造Foo::Foo(...)
有一个功能struct foo *foo_new(...)
对于现实生活中的例子,看到古老的GObject库 。
文章来源: Is there a simple way to code the strategy (or other) design pattern in ANSI C that would fit on the screen of an 11\" MacBook Air? [closed]