2012-04-03 49 views
2

假設我設計了一個表示UI控件上的夾點以調整其大小的組件。對象子類化方法

Control

現在顯然各握不行爲方面完全一樣,例如左上角抓地力會顯示一個西北東南鼠標光標並拖動它會改變控件的大小而頂部中間手柄需要顯示南北鼠標光標並拖動它只會讓你改變高度。

在執行方面有兩種基本方法: -

(1)這就需要你在信息傳遞爲你設計什麼基普的抓地力,然後有內一個巨大的switch語句構造以限定把手的實際行爲像這樣: -

- initWithGripType(int)gripType 
{ 
    switch(gripType { 
     case TOP_MIDDLE_GRIP: 
      cursorType = northSouthCursor; 
      draggedMovement = upDown; 
      break; 
     case TOP_LEFT_GRIP: 
      cursorType = northWestSouthEastCursor; 
      draggedMovement = upDownLeftRight; 
      break; 
     ... 
     ... 
     ... 
    } 
} 

(2)具有抓握基類定義的公共屬性。例如,無論它是哪種抓地力,繪製手柄都是一樣的。然後再轉類各把持類型鏈接纔可這樣: -

@interface Grip : NSObject { 
    NSCursor _cursorType; 
    int _draggedMovement; 
} 

// force init to be unavilable for base class 
- (id)init __attribute__((unavailable("Instantiate subclass instead."))); 
- (void)drawGrip; 

@end; 



@interface GripTopLeft : Grip { 
} 

- (id)init; 

@end; 

@interface GripBottomLeft : Grip { 
} 

- (id)init; 

@end; 

... 
... 
... 

方法有兩個有我沒有維護任何switch語句,並可以隨意添加新的握類型的優勢,不足之處是,如果我有很多抓握類型,每個都是一個單獨的源文件和頭文件。

有沒有第三種方法?

回答

0

有很多方法可以將這個作爲一個單獨的類來實現,而無需使用不切實際的switch語句。這裏有兩個:

  • 用方便的方法(即工廠方法),以獲得不同的gripTypes
  • 使用NSDictionary,而不是一個switch語句基於其類型來設置一握的屬性

我傾向於用一種方法來保留它,因爲如果你想通過子類自定義Grip的行爲,那麼用第二種方法就必須爲每種類型編寫另一個子類,或者修改你的類層次結構。

相關問題