首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对象子类方法

对象子类方法
EN

Stack Overflow用户
提问于 2012-04-03 10:03:29
回答 1查看 72关注 0票数 2

假设我正在设计一个组件,表示UI控件上的抓取器,用于调整它的大小。

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

在执行方面,有两种基本办法:

(1)是一个构造函数,它要求您传递关于您正在设计的抓地力的信息,然后在其中有一个巨大的开关语句来定义抓地力的实际行为,如下所示:

代码语言:javascript
运行
复制
- 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基类。画一个抓地力是一样的,不管它是什么抓地力。然后每个抓地力类型的子类是这样的:

代码语言:javascript
运行
复制
@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;

...
...
...

第二种方法的优点是我不需要维护任何开关语句,可以随意添加新的抓地力类型,缺点是如果我有很多抓地力类型,那么现在每个抓地线都是一个单独的源文件和头文件。

有第三种方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-03 10:14:34

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

  • 使用方便方法(即工厂方法)获取不同的gripTypes
  • ,使用NSDictionary代替开关语句根据抓地力的类型

设置其属性

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9991063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档