假设我正在设计一个组件,表示UI控件上的抓取器,用于调整它的大小。
显然,每个抓地力在行为上并不完全相同,例如,左上角的抓地力必须显示一个西北东南方向的鼠标光标,拖动它将改变控件的大小,而顶部中间的抓地力需要显示一个北南鼠标光标,拖动它只会允许你改变高度。
在执行方面,有两种基本办法:
(1)是一个构造函数,它要求您传递关于您正在设计的抓地力的信息,然后在其中有一个巨大的开关语句来定义抓地力的实际行为,如下所示:
- 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;
...
...
...
第二种方法的优点是我不需要维护任何开关语句,可以随意添加新的抓地力类型,缺点是如果我有很多抓地力类型,那么现在每个抓地线都是一个单独的源文件和头文件。
有第三种方法吗?
发布于 2012-04-03 10:14:34
有许多方法可以将其实现为单个类,而不必使用不灵活的switch语句。这里有两个:
NSDictionary
代替开关语句根据抓地力的类型设置其属性
我倾向于将其保存在一个方法中,因为如果您想通过子类定制Grip
的行为,那么使用第二种方法,您必须为每个类型编写另一个子类,或者修改类层次结构。
https://stackoverflow.com/questions/9991063
复制相似问题