Objective c 目标c是一种阶级误会吗?
我有以下对象结构: 动物,狗和猫。正如你们所料,狗和猫是从动物身上遗传下来的 我有一节农场课:Objective c 目标c是一种阶级误会吗?,objective-c,instanceof,Objective C,Instanceof,我有以下对象结构: 动物,狗和猫。正如你们所料,狗和猫是从动物身上遗传下来的 我有一节农场课: @implementation AnimalFarm -(Animal*) createAnimal:(AnimalType)type{ switch (type) { case CAT: return [Cat new]; case DOG: return [Dog new]; default: return [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
dog的实现类似
但这两个班的学生都并没有像我预期的那个样工作
我错过什么了吗
当我使用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:
仅在实例的类完全相同时返回YES
,而isKindOfClass:
在实例的类相同或给定类的子类相同时返回YES
例如,这将输出No代码>:
BOOL result = [[NSMutableArray array] isMemberOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
但这将输出Yes代码>:
BOOL result = [[NSMutableArray array] isKindOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
这是因为NSMutableArray是NSArray的一种,但它不是NSArray类的成员(否则它就不是NSMutableArray)
在整个基础和可可中,有许多“类簇”。有关这方面的更多信息,请参阅上的文档。由于类集群的性质,如果您创建一个NSString
对象,它可能会使isMemberOfClass:[NSString class]
测试失败
如果isKindOfClass:
或isMemberOfClass:
都没有返回正确的值,请查看实际对象所属的类
NSLog(@"cat class = %@, dog class = %@", [cat className], [dog className]);
如果它们返回的不是它们应该返回的内容,那么您的农场类就有问题。您的问题在其他地方
我创建了你的Animal
、Dog
和Cat
类,以及你上面通过的四个案例。以下是我的代码供参考:
它输出:
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
编辑:
我想有一点可能是您的AnimalFarm
对象是错误的来源,但我只是尝试以这种方式创建动物对象,并得到了相同的结果(代码:):
编辑#2:
根据您对if…else if语句有效但switch语句无效的观察,我修改了上面发布的代码以使用switch语句。。。。而且效果很好。所以我的评论/问题是:在if/switch语句中,您使用了这些常量DOG
和CAT
。这些定义在哪里?您缺少中断,这就是您的交换机无法工作的原因。应该是这样的
switch (type) {
case CAT:
return [Cat new];
break;
case DOG:
return [Dog new];
break;
default:
return [Animal new];
break;
}
澄清一下:isMemberOfClass:
和iskindof class:
在这些示例中都返回NO?在编译过程中是否收到任何警告?我们可以看看CAT
和DOG
的定义吗?还有,你说“没有像我预期的那样工作”是什么意思?断言的结果是什么?什么不起作用?测试失败了吗?如果是,哪些是?在您发布的代码中没有定义的CAT
和DOG
常量。日志的输出是:CAT class=CAT,DOG class=DOG我尝试使用alloc和init更改new,但结果仍然相同。正如您所看到的,我使用isMemberOfClass比较了正确的类,因此它应该返回YES以及isKindOfClassWell,我尝试直接使用[Cat new]创建实例,一切都正常……所以问题就在里面farm@Vitek-您如何定义猫和狗?
switch (type) {
case CAT:
return [Cat new];
break;
case DOG:
return [Dog new];
break;
default:
return [Animal new];
break;
}