Tengo la siguiente estructura de objetos:Objetivo c isKindOfClass mal entendido?
Animal, perros y gatos. Como espera, Dog y Cat son heredados de Animal.
Y tengo una clase de granja:
@implementation AnimalFarm
-(Animal*) createAnimal:(AnimalType)type{
switch (type) {
case CAT:
return [Cat new];
case DOG:
return [Dog new];
default:
return [Animal new];
}
}
@end
y traté de prueba de unidad:
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!");
Implementación de clases:
@interface Cat : Animal {
}
@end
@implementation Cat
-(NSString*) say{
return @"miau";
}
@end
Aplicación del perro es similar.
pero tampoco isKindOfClass o isMemberOfClass trabajaron como yo esperaba ....
Me estoy perdiendo algo?
Cuando uso IFs en lugar de switch, todo va bien ... pero ¿cuál es la diferencia?
Implementación de createAnimal que trabaja:
-(Animal *) createAnimal:(AnimalType)type {
if (type == DOG) {
return [Dog new];
} else if (type == CAT) {
return [Cat new];
} else {
return [Animal new];
}
Para aclarar: Both 'isMemberOfClass:' y 'isKindOfClass:' devuelven NO en esos ejemplos? – Chuck
¿Y recibe advertencias durante la compilación? – Chuck
¿Podemos ver la definición de 'CAT' y' DOG'? Además, ¿a qué te refieres con "no funcionó como esperaba"? ¿Cuáles son los resultados de las afirmaciones? – Tim