Ziel c ist ein Missverständnis von KindOfClass?

Ich habe folgende Objektstruktur:

Tier, Hund und Katze. Wie Sie erwarten, werden Hund und Katze von Animal geerbt.

Und ich habe eine Farmklasse:

 @implementation AnimalFarm

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

  switch (type) {

    case CAT:
      return [Cat new];

    case DOG:
      return [Dog new];

    default:
      return [Animal new];
  }

}

@end

und ich habe versucht, Unit-Test:

  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!");

Implementierung von Klassen:

@interface Cat : Animal {

}


@end

@implementation Cat

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

@end

Die Umsetzung von Hund ist ähnlich.

aber weder isKindOfClass noch isMemberOfClass haben wie erwartet funktioniert ....

Vermisse ich etwas?

Wenn ich IFs anstelle von switch benutze, geht alles gut ... aber was ist der Unterschied?

Implementierung von createAnimal, die funktioniert:

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

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage