У меня есть следующая структура объектов:
Животное, Собака и 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];
}
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]);
, если они возвращают все, что они предполагают Чтобы, тогда возникает проблема с вашим классом фермы.
Ваша проблема в другом месте.
Я создал ваши Классы животных
, Собаки
и Кошки
, а также четыре случая, которые вы пропустили выше. Для справки, вот мой код: 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
. Где они определены?