サブクラスがスーパークラスの ivar で指定されたものよりも具体的な型を使用する必要があるクラス階層がある場合、スーパークラス ivar を id として宣言するか、それを入力してからサブクラスで必要に応じてキャストする方がよいでしょうか?
たとえば、Thing 型の ivar を使用するスーパークラスがあります。
@interface SuperClass {
Thing *_typedIvar; // OR
id anonIvar;
}
@property (nonatomic, retain, readwrite) Thing *_typedIvar;
@property (nonatomic, retain, readwrite) id anonIvar; // OR
次に、サブクラスの実装で、SubThing を使用してその methodNotInThing を取得したい
@interface SubClass : SuperClass {
}
@implementation {
- (void)aMethod {
SubThing *subtypedIvar = (SubThing *)self.typedIvar;
[subtypedIvar methodNotInThing];
// OR
[self.anonIvar methodNotInThing];
}
}
(ここでは、サブクラスが適切に SubThing を ivar に割り当てていると想定しています)。
私は両方のアプローチを使用しました (これまで ObjC を使用していた短い時間でした) が、どちらが最適かについて完全に解決されることはありません。必要に応じてドット構文を使用できることに加えて、実数型の使用によって提供されるコンパイラ チェックが気に入っています。しかし、サブクラスでの定数のキャストはかなり醜くなり、より多くのコードが必要になり、どういうわけか私には味が悪くなります (これはほとんど議論の余地がないと思います)。ただし、型付きバージョンでは、実質的にスーパークラスがサブクラスが ivar で何をすべきかを文書化するという事実が気に入っています。
上記のうちどれがより良いアプローチであり、その理由は?