对象子类化方法

问题描述:

假设我设计了一个表示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语句,并可以随意添加新的握类型的优势,不足之处是,如果我有很多抓握类型,每个都是一个单独的源文件和头文件。

有没有第三种方法?

有很多方法可以将这个作为一个单独的类来实现,而无需使用不切实际的switch语句。这里有两个:

  • 用方便的方法(即工厂方法),以获得不同的gripTypes
  • 使用NSDictionary,而不是一个switch语句基于其类型来设置一握的属性

我倾向于用一种方法来保留它,因为如果你想通过子类自定义Grip的行为,那么用第二种方法就必须为每种类型编写另一个子类,或者修改你的类层次结构。