是否有一种简单的方法可以在ANSI C中编写适合11“MacBook Air屏幕的策略(或其他)设计模式?

似乎ANSI C中的OO并不是今天OO的首选方法。 有没有人知道使用严格的ANSI C编写简单设计模式的方法,所以我可以向朋友certificate它是可能的?(Axel-Tobias Schreiners的书让我继续这个!)

使用C的OO确实可以使用函数指针来实现,正如在这个SO问题中所解释的那样。

使用该post中的信息,我将使用基本inheritance在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; } 

虚拟表实现非常基础,但应该可以工作。 理想情况下,应该实施更强大的东西。

然后你只需要在需要策略的Struct中使用指向StrategyBase的指针,并且你有一个用C实现的策略模式。我没有尝试过编译它,但这应该是一个很好的起点。

它什么都没有; 而不是类Foo ,使用struct foo ; 而不是构造函数Foo::Foo(...) ,有一个函数struct foo *foo_new(...)

有关实际示例,请参阅古老的GObject库 。