在子类中重新转换属性

时间:2012-07-10 16:57:08

标签: objective-c ios subclassing

我有一个设置,其中我有一个视图类型的层次结构,具有等效的模型类型层次结构。设置如下:

节点模型/数据:

@interface GenericNode : NSObject
//blah blah blah
@end
@interface ShapeNode : GenericNode
//more blah
@end

nodeViews,它将始终接收一个等效类型的节点作为其模型:

@interface GenericNodeView : UIView
@property (nonatomic, strong) GenericNode * model;
@end
@interface ShapeNodeView : GenericNodeView
@end

但是,这里的问题是model的类型总是保留为抽象超类,迫使我每次想要访问子类的属性方法时都要强制转换它。

有没有办法重新创建类属性,以便exampleShapeNodeView.model始终返回ShapeNode的实例,依此类推?

我尝试过自定义访问器方法,例如

@interface GenericNodeView : UIView
@property (nonatomic, strong) GenericNode * model;
-(GenericNode *)myModel;
@end
@interface ShapeNodeView : GenericNodeView
-(ShapeNode *)myModel;
@end

//in genericNodeView implementation
-(GenericNode *)myModel{
  return (GenericNode *) self.model;
}

//in shapeNodeView implementation
-(ShapeNode *)myModel{
  return (ShapeNode *) self.model;
}

但是调用[exampleShapeNodeView myModel]仍会返回GenericNode;

3 个答案:

答案 0 :(得分:5)

我刚刚对此进行了测试,这对我很有用:

在子课程中,使用@property重新声明:

@interface GenericNodeView : UIView
@property (nonatomic, strong) GenericNode * model;
@end
@interface ShapeNodeView : GenericNodeView
@property (nonatomic, strong) ShapeNode * model;
@end

你也需要重新合成,但我的Xcode没有抱怨(4.3.3)

答案 1 :(得分:0)

制作另一个变量并执行ShapeNode *anotherVariable = (ShapeNode *) someVariable

答案 2 :(得分:0)

对于所有演员而言,代码并非“错误”,只是“感觉”对你不对。虽然可能有一种代码方式可以在没有Xcode抱怨的情况下执行您想要的操作,但您可以考虑稍微更改设计。

当然,一种方法是只做一切id类型然后你可以调用你想要的对象上的任何方法,但我猜你不想这样做。

此外,由于您想要在视图层次结构中排列视图,我猜测您希望在它们之间重用逻辑,即经典对象子类化。

您可能会考虑将getter和setter放在'leaf'类上,例如,层次结构中没有任何子级的类。通过这种方式,您可以根据需要制作特定的签名,而不需要对其进行转换,因为它们不在上层类中,所以您不会遇到名称冲突。我敢打赌,你想要留在父类中的逻辑是常见的,因为它为视图提供了通用函数,而不是作用于模型的逻辑。