Mam następującą strukturę obiektów:Celem c jest missunderstanding KindOfClass?
Zwierząt, psów i kotów. Jak się spodziewasz, pies i kot są dziedziczone po Zwierzęciu.
i mam klasę rolnicze:
@implementation AnimalFarm
-(Animal*) createAnimal:(AnimalType)type{
switch (type) {
case CAT:
return [Cat new];
case DOG:
return [Dog new];
default:
return [Animal new];
}
}
@end
i próbowałem testów jednostkowych:
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!");
Realizacja zajęć:
@interface Cat : Animal {
}
@end
@implementation Cat
-(NSString*) say{
return @"miau";
}
@end
Realizacja pies jest podobny.
ale ani isKindOfClass lub isMemberOfClass działało jak się spodziewałem ....
Am I czegoś brakuje?
Kiedy używam IFs zamiast switcha, wszystko idzie dobrze ... ale jaka jest różnica?
Realizacja createAnimal który działa:
-(Animal *) createAnimal:(AnimalType)type {
if (type == DOG) {
return [Dog new];
} else if (type == CAT) {
return [Cat new];
} else {
return [Animal new];
}
Aby wyjaśnić: Zarówno 'isMemberOfClass:', jak i 'isKindOfClass:' zwracają NO w tych przykładach? – Chuck
Czy otrzymujesz ostrzeżenia podczas kompilacji? – Chuck
Czy widzimy definicję "CAT" i "DOG"? Co masz na myśli mówiąc "nie działa tak, jak się spodziewałem"? Jakie są wyniki twierdzeń? – Tim