Цель c является KindOfClass недоразумение?

У меня следующая структура объектов:

Животное, Собака и Кошка. Как вы ожидаете, Собака и Кошка унаследованы от 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

Реализация собаки похожа.

но ни isKindOfClass, ни isMemberOfClass не сработали, как я ожидал ....

Я что-то пропустил?

Когда я использую IF вместо switch, тогда все идет хорошо ... но в чем разница?

Реализация createAnimal, которая работает:

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос