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;
}