Objective c 对象子类化方法

Objective c 对象子类化方法,objective-c,oop,Objective C,Oop,假设我正在设计一个组件,该组件表示UI控件上的夹点,用于调整其大小 现在很明显,每个夹点在行为上并不完全相同,例如,左上夹点必须显示一个西北-东南鼠标光标,拖动它将更改控件的大小,而中上夹点需要显示一个南北鼠标光标,拖动它将只允许您更改高度 在实施方面,有两种基本方法:- (1)一种构造函数,它要求您传入有关正在设计的夹点kip的信息,然后在其中包含一个巨大的开关语句,以定义夹点的实际行为,如下所示:- - initWithGripType(int)gripType { switch(

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

现在很明显,每个夹点在行为上并不完全相同,例如,左上夹点必须显示一个西北-东南鼠标光标,拖动它将更改控件的大小,而中上夹点需要显示一个南北鼠标光标,拖动它将只允许您更改高度

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

(1)一种构造函数,它要求您传入有关正在设计的夹点kip的信息,然后在其中包含一个巨大的开关语句,以定义夹点的实际行为,如下所示:-

- initWithGripType(int)gripType
{
    switch(gripType {
        case TOP_MIDDLE_GRIP:
            cursorType = northSouthCursor;
            draggedMovement = upDown;
            break;
        case TOP_LEFT_GRIP:
            cursorType = northWestSouthEastCursor;
            draggedMovement = upDownLeftRight;
            break;
        ...
        ...
        ...
    }
}
(2)具有定义公共属性的夹点基类。e、 g画一个把手是一样的,不管它是哪个把手。然后是每个夹点类型的子类,如:-

@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语句。这里有两个:

  • 使用方便的方法(即工厂方法)获得不同的GripType
  • 使用
    NSDictionary
    而不是switch语句根据夹点的类型设置夹点的属性

我倾向于将其保留在一种方法中,因为如果您想通过子类化定制
Grip
的行为,那么使用第二种方法,您必须为每种类型编写另一个子类,或者修改您的类层次结构。

有很多方法可以将其作为单个类实现,而不必使用笨拙的switch语句。这里有两个:

  • 使用方便的方法(即工厂方法)获得不同的GripType
  • 使用
    NSDictionary
    而不是switch语句根据夹点的类型设置夹点的属性
我倾向于将其保留在一种方法中,因为如果您想通过子类化定制
Grip
的行为,那么使用第二种方法,您必须为每种类型编写另一个子类,或者修改您的类层次结构