0

サブクラスがスーパークラスの 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 で何をすべきかを文書化するという事実が気に入っています。

上記のうちどれがより良いアプローチであり、その理由は?

4

1 に答える 1

1

コードにキャストが散らばっているという欠点にもかかわらず、実際の型を使用する方が良いと私は主張します。

  • プログラマーが管理する必要があります。ここで id を使用するのは少し不注意です。
  • 追跡が容易になるため、デバッグが容易になります。
  • どこにでもキャストがあると面倒に見えるかもしれませんが、期待しているタイプを認識する必要があり、これもメンテナンスに戻ります。現時点では id で動作する可能性がありますが、id の呼び出しがいたるところにある場合、特定の id が動作していない理由をどのように知るのでしょうか?
于 2011-02-16T23:46:27.920 に答える