Объективный c isKindOfClass missunderstanding?

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

Животное, Собака и CAT. Поскольку Вы ожидаете, что Собака и CAT наследованы от Животного.

И у меня есть класс фермы:

 @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 работали, поскольку я ожидал....

Я пропускаю что-то?


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

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

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

  if (type == DOG) {
    return [Dog new]; 
  } else if (type == CAT) {
    return [Cat new]; 
  } else {
    return [Animal new];
  }
17
задан Perception 2 September 2011 в 11:09
поделиться

2 ответа

IsmumberofClass: будет возвращаться только , если класс экземпляра точно такой же, однако IskindofClass: вернется Да , если класс экземпляра То же самое или подкласс данного класса.

Например, это будет выводиться Нет! :

BOOL result = [[NSMutableArray array] isMemberOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");

Но это выводится Да! :

BOOL result = [[NSMutableArray array] isKindOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");

Это связано с тем, что Nsmutablearray - это вид Nsarray, но это не член класса NSARRay (в противном случае это не будет Nsmutablearray).

На протяжении всего фундамента и какао есть ряд «классовых кластеров». Вы можете прочитать больше об этом в документации на веб-сайте разработчика Apple . Из-за природы классовых кластеров, если вы создаете, возможно, объект NSSTRING , он может провалиться в IsmumberofClass: [Класс NSString] .

Если ни один IskindofClass: или IsmemberofClass: возвращает правильное значение, см. В каком классе фактический объект со

NSLog(@"cat class = %@, dog class = %@", [cat className], [dog className]);

, если они возвращают все, что они предполагают Чтобы, тогда возникает проблема с вашим классом фермы.

45
ответ дан 30 November 2019 в 11:32
поделиться

Ваша проблема в другом месте.

Я создал ваши Классы животных , Собаки и Кошки , а также четыре случая, которые вы пропустили выше. Для справки, вот мой код: 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

EDIT:

Полагаю, была небольшая вероятность того, что ваш 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

EDIT #2:

Основываясь на вашем наблюдении, что если...если утверждение работает, а утверждение переключателя нет, я изменил код, который я разместил выше, чтобы использовать утверждение переключателя...., и он работал просто отлично. Так что мой комментарий/вопрос остается в силе: В своих утверждениях if/switch вы используете эти константы DOG и CAT. Где они определены?

.
3
ответ дан 30 November 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: