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

同様に再@合成する必要がありますが、私のXcode(4.3.3)による苦情はありませんでした

于 2012-07-10T17:10:06.497 に答える
0

別の変数を作成して実行しますShapeNode *anotherVariable = (ShapeNode *) someVariable

于 2012-07-10T17:06:49.400 に答える
0

コードはすべてのキャストで「間違っている」わけではなく、単に「間違っている」と感じているだけです。Xcodeに文句を言わずにやりたいことを実行するコード方法があるかもしれませんが、デザインを少し変更することを検討するかもしれません。

もちろん、1つの方法は、すべてをidタイプにすることです。そうすれば、必要なオブジェクトに対して任意のメソッドを呼び出すことができますが、それはしたくないと思います。

また、ビューをビュー階層に配置したいので、ビュー間のロジック、つまりクラシックオブジェクトのサブクラス化を再利用したいと思います。

ゲッターとセッターを「leaf」クラスに配置することを検討してください。たとえば、子を持たない階層内のクラスです。このようにして、署名を必要に応じて具体的にすることができ、物事をキャストする必要はありません。また、それらは上位レベルのクラスにないため、名前の衝突に遭遇することはありません。親クラスに残したいロジックは、モデルに作用するロジックではなく、ビューにジェネリック関数を提供するという意味で一般的であると思います。

于 2012-07-10T17:15:22.660 に答える