19

私はオブジェクトの次の構造を持っています:

動物、犬、猫。ご想像のとおり、Dog と Cat は Animal から継承されています。

そして、私は農場のクラスを持っています:

 @implementation AnimalFarm

-(Animal*) createAnimal:(AnimalType)type{

  switch (type) {

    case CAT:
      return [Cat new];

    case DOG:
      return [Dog new];

    default:
      return [Animal new];
  }

}

@end

そして私は単体テストを試みました:

  AnimalFarm *farm = [AnimalFarm new];

  Animal *dog = [farm createAnimal:DOG];
  Animal *cat = [farm createAnimal:CAT];

  STAssertTrue([cat isMemberOfClass:[Cat class]],@"cat is not a cat!");
  STAssertTrue([dog isMemberOfClass:[Dog class]],@"Dog is not a dog!");

  STAssertTrue([cat isKindOfClass:[Animal class]],@"Cat is not an animal!");
  STAssertTrue([dog isKindOfClass:[Animal class]],@"Cat is not an animal!");

クラスの実装:

@interface Cat : Animal {

}


@end

@implementation Cat

  -(NSString*) say{
    return @"miau";
}

@end

dog の実装も同様です。

しかし、isKindOfClassもisMemberOfClassも期待どおりに機能しませんでした....

何か不足していますか?


スイッチの代わりに IF を使用すると、すべてがうまくいきますが、違いは何ですか?

機能する createAnimal の実装:

-(Animal *) createAnimal:(AnimalType)type {

  if (type == DOG) {
    return [Dog new]; 
  } else if (type == CAT) {
    return [Cat new]; 
  } else {
    return [Animal new];
  }
4

3 に答える 3

3

あなたの問題は別の場所にあります。

AnimalDog、およびCatクラスを作成し、上記の 4 つのケースに合格しました。参考までに、ここに私のコードがあります: http://pastie.org/774468

以下を出力します。

2010-01-11 19:45:10.259 EmptyFoundation[83698:a0f] [cat isMemberOfClass:[Cat class]] PASSED
2010-01-11 19:45:10.265 EmptyFoundation[83698:a0f] [dog isMemberOfClass:[Dog class]] PASSED
2010-01-11 19:45:10.265 EmptyFoundation[83698:a0f] [cat isKindOfClass:[Animal class]] PASSED
2010-01-11 19:45:10.273 EmptyFoundation[83698:a0f] [dog isKindOfClass:[Animal class]] PASSED

編集:

オブジェクトがエラーの原因である可能性がわずかにあったと思いAnimalFarmますが、その方法で動物オブジェクトを作成しようとしたところ、同じ結果が得られました (コード: http://pastie.org/774480 ):

2010-01-11 19:51:35.144 EmptyFoundation[83741:a0f] [cat isMemberOfClass:[Cat class]] PASSED
2010-01-11 19:51:35.156 EmptyFoundation[83741:a0f] [dog isMemberOfClass:[Dog class]] PASSED
2010-01-11 19:51:35.157 EmptyFoundation[83741:a0f] ![ant isMemberOfClass:[Cat class]] PASSED
2010-01-11 19:51:35.157 EmptyFoundation[83741:a0f] [cat isKindOfClass:[Animal class]] PASSED
2010-01-11 19:51:35.157 EmptyFoundation[83741:a0f] [dog isKindOfClass:[Animal class]] PASSED
2010-01-11 19:51:35.158 EmptyFoundation[83741:a0f] [ant isKindOfClass:[Animal class]] PASSED

編集#2:

if...else if ステートメントは機能するが、switch ステートメントは機能しないという観察に基づいて、上に投稿したコードを変更して、switch ステートメントを使用するようにしました....そして、問題なく機能しました。したがって、私のコメント/質問は次のとおりです。 if/switch ステートメントでは、これらの定数DOGとを使用していますCAT。それらはどこで定義されていますか?

于 2010-01-12T02:46:26.947 に答える
-10

休憩が取れていないため、スイッチが機能していません。このように見えるはずです。

switch (type) {

 case CAT:
   return [Cat new];
 break;
 case DOG:
   return [Dog new];
 break;
 default:
   return [Animal new];
 break;
}
于 2011-08-29T20:31:35.487 に答える