2

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

节点模型/数据:

@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

4

3 回答 3

5

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

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

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

您还需要重新@synthesize,但我的 Xcode (4.3.3) 没有抱怨

于 2012-07-10T17:10:06.497 回答
0

代码对所有的演员都不是“错误的”,它只是让你“感觉”错了。虽然可能有一种代码方式可以在没有 Xcode 抱怨的情况下完成您想做的事情,但您可能会考虑稍微更改设计。

当然,一种方法是只将所有内容设置为 id 类型,然后您可以在所需的对象上调用任何方法,但我猜您不想这样做。

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

您可能会考虑将 getter 和 setter 放在“叶”类上,例如,层次结构中没有任何子级的类。通过这种方式,您可以根据需要使签名变得具体而无需随意转换,并且由于它们不在上层类中,因此您不会遇到名称冲突。我敢打赌,您想留在父类中的逻辑是常见的,因为它为视图提供通用功能,而不是作用于模型的逻辑。

于 2012-07-10T17:15:22.660 回答
0

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

于 2012-07-10T17:06:49.400 回答