我想将一个过程事件C API包装到Objective-C中。程序API围绕一些不透明指针,比如说EventRef
。可以通过此类型表示几种事件 - 鼠标事件,键盘事件等。您可以通过调用某个函数来获取事件的类型,例如EventGetType(event)
。
用不同的类来表示不同的事件种类似乎很自然。换句话说,拥有Event
类和子类,如MouseEvent
或KeyboardEvent
。我的问题是如何创建给定EventRef
的实例?
我不能简单地拥有一个带有EventRef
的公共初始化程序,因为调用者必须在初始化之前找到正确的类。这感觉很笨拙:
EventType type = EventGetType(event);
switch (type) {
case EventTypeMouse:
…[[MouseEvent alloc] initWithEvent:event]…
case EventTypeKeyboard:
…[[KeyboardEvent alloc] initWithEvent:event]…
我可以在Event
初始化程序中做一些魔术,以便它为被调用者选择正确的类:
@implementation Event
- (id) initWithEvent: (EventRef) event {
// pick correct subclass, initialize and return that
}
其中一个缺点是,这会使事件类型的子类化变得更加困难。而且我不喜欢初始化程序中的魔法。我也可以写一些注册表,但这已经感觉太复杂了。你会怎么做? (请注意,事件API只是一个例子,可以提供更具体的理由。)
答案 0 :(得分:1)
您使用魔术初始化程序描述的方案是工厂模式。我认为这确实是这样,但我不会这样做,而是:
@interface EventFactory
- (id) eventForEventRef:(EventRef)event;
@end
也就是说,将工厂搬到自己的班级。这样,一旦添加新的子类,就不必乱用超类。