我有一个设置,其中我有一个视图类型的层次结构,具有等效的模型类型层次结构。设置如下:
节点模型/数据:
@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
;
答案 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'类上,例如,层次结构中没有任何子级的类。通过这种方式,您可以根据需要制作特定的签名,而不需要对其进行转换,因为它们不在上层类中,所以您不会遇到名称冲突。我敢打赌,你想要留在父类中的逻辑是常见的,因为它为视图提供了通用函数,而不是作用于模型的逻辑。