2011-03-10 15 views
0

我想將程序性事件C API包裝到Objective-C中。程序API圍繞着一些不透明的指針,例如EventRef。有幾種類型的事件可以用這種類型來表示 - 鼠標事件,鍵盤事件等。您可以通過調用某個函數來獲得事件的種類,如EventGetType(event)如何在將程序代碼封裝到OOP時創建實例?

用不同的類表示不同的事件種類似乎很自然。換句話說,有一個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僅僅是一個更具體的理由的例子。)

+0

爲什麼downvote,這個問題不清楚或沒有用? – zoul 2011-03-10 13:47:30

+0

在那裏,通過upvote修復downvote ;-) – DarkDust 2011-03-10 13:53:20

回答

1

您用魔法初始化器描述的方案是工廠模式。我認爲這的確是這樣,但我不會那樣做,而是:

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

也就是說,將工廠移動到它自己的類。這樣,一旦添加新的子類,就不必惹惱超類。

+0

你是對的。這是我在問題中稱爲「註冊表」的方法,結果相當簡單。謝謝! – zoul 2011-03-11 16:03:49

相關問題