对象子类化方法

时间:2012-04-03 10:03:30

标签: objective-c oop

假设我正在设计一个代表UI控件上的夹点的组件,用于调整它的大小。

Control

现在显然每个抓地力在行为方面并不完全相同,例如左上方的抓地力必须显示西北东南方向的鼠标光标并拖动它将改变控制尺寸,而顶部中间抓地力需要显示南北方向的鼠标光标并拖动它只会让你改变高度。

在实施方面,有两种基本方法: -

(1)一个构造函数,它要求你传递关于你正在设计的把手的kip的信息,然后在里面有一个巨大的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)有一个用于定义公共属性的grip基类。例如,无论握力是什么,绘制握把都是相同的。然后每种抓握类型的子类如此: -

@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语句,并且可以随意添加新的句柄类型,缺点是如果我有很多句柄类型,每个类型现在都是一个单独的源文件和头文件。

有第三种方法吗?

1 个答案:

答案 0 :(得分:0)

有很多方法可以将它作为单个类实现,而无需使用难以置信的switch语句。这是两个:

  • 使用便捷方法(即工厂方法)来获得不同的gripTypes
  • 使用NSDictionary代替switch语句根据类型设置夹点的属性

我倾向于将其保留在一个方法中,因为如果你想通过子类化来自定义Grip的行为,那么你需要为第二种方法编写另一个子类,或者修改你的类层次结构。