【发布时间】:2011-01-03 23:19:29
【问题描述】:
我有以下对象结构:
动物、狗和猫。正如您所期望的,Dog 和 Cat 是从 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 都没有按我的预期工作....
我错过了什么吗?
当我使用 IFs 而不是 switch 时,一切都很顺利......但有什么区别?
有效的 createAnimal 的实现:
-(Animal *) createAnimal:(AnimalType)type {
if (type == DOG) {
return [Dog new];
} else if (type == CAT) {
return [Cat new];
} else {
return [Animal new];
}
【问题讨论】:
-
澄清一下:
isMemberOfClass:和isKindOfClass:在这些示例中都返回 NO? -
编译过程中是否收到任何警告?
-
我们能看到
CAT和DOG的定义吗?另外,你是什么意思“没有像我预期的那样工作”?断言的结果是什么? -
什么不起作用?测试是否失败?如果有,是哪些?
-
在您发布的代码中没有定义
CAT和DOG常量。