2011-01-06 13 views
4

時にクラスタイプを決定します。実行時にObjective Cの - 私はこれを持っているインタフェースでは、実行時

Animal*  myPet; 

を私はmyPetは、動物のサブクラスです猫や犬になりたいことがあります。

id newPet; 
    if(someCondition) { 
      newPet = [[Cat alloc] initWithNibName:@"Cat" bundle:nil]; 
    } else { 
      newPet = [[Dog alloc] initWithNibName:@"Dog" bundle:nil]; 
    } 
    self.myPet = newPet; 

明らかにこれは間違っていますが、私がしようとしていることを示すだけで十分です。これを行うベストプラクティスは何ですか?

+3

なぜこれが間違っていると思いますか? –

+2

あなたのコードでたくさんの 'isKindOfClass:'を実行することは、一般的にあなたが物事を困難な方法でやっていることを示しています。 – bbum

+0

@Dave - 動作しないためです。 newPet.hunger = 50を試してみると、 'newPet'のメンバ 'hunger'のリクエストがあります。これは非クラス型の 'objc_object *'です – sol

答えて

8

は、idの代わりにAnimal *と強く入力してください。 idは任意のクラスのインスタンスへの参照を保持できますが、プロパティでは使用できません(ドット構文には強く型付けされた左辺値が必要です)。CatDogの両方がAnimalから継承されているため、

あなたがいない共通の祖先(過去NSObject)を行う2つのクラスを使用している場合は、ステップを取り戻すと、あなたのデザインを再考すべきである - なぜこれら二つのクラスのインスタンスを占有する必要があるだろう同じ変数ですか?タイトルに基づいて、Googleから到着誰のための

9

isKindOfClassはあなたの友達です:

[newPet isKindOfClass:Dog.class] == NO 
+0

isKindOfClassについて理解していますが、私のサンプルコードでどのように収まるか分かりません。私は動物のクラスの種類を決定しようとしていない、私はsomeConditionに基づいて異なる種類の動物を作成しようとしている。 – sol

+0

@sol:あなたが探している "someCondition"は、The-Kennyが投稿したものです(つまり、[newPet isKindOfClass:Dog.class] == NO')。 – Senseful

3
NSString *className = @"Cat"; 
Animal *myPet = [[NSClassFromString(className) alloc] init]; 

それはあなたが後にあるかは不明だが、あなたは、文字列で指定されたクラスのインスタンスを作成する場合、これはそれを行う必要があります。

2

:ここでは、「実行時にクラスタイプを決定する」知っているいくつかの有用なものです:あなたが参照を取得するために、実行時にNSObject*classメソッドを呼び出すことができます

そのクラスに。

[myObject class]; 

あまりにもこれらのメソッドを見てみましょう:

  • isKindOfClass:を - オブジェクトはどこでもその階層内のクラスに属しているかどうかを確認します。
  • isMemberOfClass: - オブジェクトが特定のクラスに属しているかどうかを確認します。
関連する問題