gpt4 book ai didi

objective-c - Objective c isKindOfClass 误解?

转载 作者:太空狗 更新时间:2023-10-30 03:15:26 31 4
gpt4 key购买 nike

我有以下对象结构:

动物、狗和猫。如您所料,Dog 和 Cat 是从 Animal 继承而来的。

我有一个农场类(class):

 @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 的实现类似。

但 isKindOfClass 或 isMemberOfClass 都没有像我预期的那样工作....

我错过了什么吗?


当我使用 IF 而不是 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)。

在整个 Foundation 和 Cocoa 中,有许多“类集群”。您可以在 Apple's developer web site 上的文档中阅读更多相关信息.由于类簇的性质,如果您可能创建了一个 NSString 对象,它可能无法通过 isMemberOfClass:[NSString class] 测试。

如果 isKindOfClass:isMemberOfClass: 都没有返回正确的值,请查看实际对象属于哪个类

NSLog(@"cat class = %@, dog class = %@", [cat className], [dog className]);

如果它们返回的不是它们应该返回的任何东西,那么你的农场类就有问题。

关于objective-c - Objective c isKindOfClass 误解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045561/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com