【发布时间】:2011-03-03 15:15:49
【问题描述】:
关于使用 iOS SDK 的一些软件设计决策,我有一个非常简单的问题。
假设我有一个类来管理我的应用程序中视图对象的呈现 (UIManager)。此类允许外部控制器类向其添加视图对象。视图对象可以有两种:CALayer 和 UIView 子类。
我的问题是哪个接口更适合UIManager 类。
例如:
@interface UIManager : UIView {}
// 1)
- (void)addGenericViewObject:(id)genericViewObject;
// 2)
- (void)addUIViewObject:(UIView*)uiViewObject;
- (void)addCALayerObject:(CALayer*)caLayerObject;
// 3)
- (void)addMyProtocolTypeViewObject(id<MyProtocolType>)myProtocolTypeViewObject;
@end
1) id 类型太通用了?
2) 每种类型使用不同的方法签名会导致严重的代码重复?
3) 有没有办法通过<MyProtocolType> 表示UIView 和CALayer 类?
或者更一般地说,处理这些不同对象的类可互换不是很好吗?
UIManager 的实现是这样的:
@implementation UIManager
// 1)
- (void)addGenericViewObject:(id)genericViewObject {
if ([genericViewObject isKindOfClass:[UIView class]]) {
[_uiViewsContainer addSubview:(UIView*)genericViewObject];
} else if ([genericViewObject isKindOfClass:[CALayer class]]) {
[_caLayersContainer addSublayer:(CALayer*)genericViewObject];
}
}
@end
类型检查总是很糟糕,也许拥有<MyProtocolType> 可以解决这种情况,但是,我如何在协议中同时表示UIView 和CALayer 类?这两个类都符合<NSObject>。
提前致谢
【问题讨论】:
标签: iphone uiview protocols class-design calayer