在将过程代码包装到OOP中时如何创建实例?

时间:2011-03-10 13:33:59

标签: objective-c oop

我想将一个过程事件C API包装到Objective-C中。程序API围绕一些不透明指针,比如说EventRef。可以通过此类型表示几种事件 - 鼠标事件,键盘事件等。您可以通过调用某个函数来获取事件的类型,例如EventGetType(event)

用不同的类来表示不同的事件种类似乎很自然。换句话说,拥有Event类和子类,如MouseEventKeyboardEvent。我的问题是如何创建给定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只是一个例子,可以提供更具体的理由。)

1 个答案:

答案 0 :(得分:1)

您使用魔术初始化程序描述的方案是工厂模式。我认为这确实是这样,但我不会这样做,而是:

@interface EventFactory
- (id) eventForEventRef:(EventRef)event;
@end

也就是说,将工厂搬到自己的班级。这样,一旦添加新的子类,就不必乱用超类。