Question

Je suit la structure des objets:

Animal, chien et chat. Comme vous attendez pour chiens et chats sont hérités de l'animal.

Et j'ai une classe agricole:

 @implementation AnimalFarm

-(Animal*) createAnimal:(AnimalType)type{

  switch (type) {

    case CAT:
      return [Cat new];

    case DOG:
      return [Dog new];

    default:
      return [Animal new];
  }

}

@end

et j'ai essayé de test unitaire:

  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!");

Mise en œuvre des classes:

@interface Cat : Animal {

}


@end

@implementation Cat

  -(NSString*) say{
    return @"miau";
}

@end

La mise en œuvre de chien est similaire.

mais ni isKindOfClass ou isMemberOfClass travaillé comme je m'y attendais ....

Est-ce que je manque quelque chose?


Quand j'utilise au lieu de l'interrupteur FI alors tout va bien ... mais quelle est la différence?

La mise en œuvre de createAnimal qui fonctionne:

-(Animal *) createAnimal:(AnimalType)type {

  if (type == DOG) {
    return [Dog new]; 
  } else if (type == CAT) {
    return [Cat new]; 
  } else {
    return [Animal new];
  }
Était-ce utile?

La solution

isMemberOfClass: ne retourne YES si la classe est exactement le même, mais isKindOfClass: de l'instance retourne YES si la classe de l'instance est le même, ou une sous-classe de la classe donnée.

Par exemple, cette volonté sortie No!:

BOOL result = [[NSMutableArray array] isMemberOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");

Mais cette volonté sortie Yes!:

BOOL result = [[NSMutableArray array] isKindOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");

En effet, un NSMutableArray est type de NSArray, mais il ne fait pas partie de la classe NSArray (sinon il ne serait pas un NSMutableArray).

Tout au long de la Fondation et du cacao, il y a un certain nombre de « clusters de classe ». Vous pouvez en lire plus à ce sujet dans la documentation sur site web développeur d'Apple . En raison de la nature des clusters de classe, si vous créez peut-être un objet NSString, il peut échouer le test isMemberOfClass:[NSString class].

Si aucune isKindOfClass: ou isMemberOfClass: est de retour la valeur correcte, voir quelle classe l'objet réel est avec

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

Si ceux-ci reviennent autre chose que ce qu'ils sont censés le faire, alors il y a un problème avec votre classe agricole.

Autres conseils

Votre problème est ailleurs.

Je créé votre Animal, Dog et classes de Cat, et les quatre cas, vous avez ci-dessus passé. Pour référence, voici mon code: http://pastie.org/774468

Il produit:

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

EDIT:

Je suppose qu'il y avait une légère possibilité que votre objet AnimalFarm était la source de l'erreur, mais je viens d'essayer de créer les objets animaux de cette façon et a obtenu les mêmes résultats (code: http://pastie.org/774480 ):

2010-01-11 19:51:35.144 EmptyFoundation[83741:a0f] [cat isMemberOfClass:[Cat class]] PASSED
2010-01-11 19:51:35.156 EmptyFoundation[83741:a0f] [dog isMemberOfClass:[Dog class]] PASSED
2010-01-11 19:51:35.157 EmptyFoundation[83741:a0f] ![ant isMemberOfClass:[Cat class]] PASSED
2010-01-11 19:51:35.157 EmptyFoundation[83741:a0f] [cat isKindOfClass:[Animal class]] PASSED
2010-01-11 19:51:35.157 EmptyFoundation[83741:a0f] [dog isKindOfClass:[Animal class]] PASSED
2010-01-11 19:51:35.158 EmptyFoundation[83741:a0f] [ant isKindOfClass:[Animal class]] PASSED

EDIT # 2:

Selon votre observation qu'une if ... else if fonctionne instruction, mais l'instruction switch n'a pas, j'ai modifié le code ci-dessus pour que j'ai posté utiliser une instruction switch .... et cela a fonctionné très bien. Donc, mon commentaire / question signifie: Dans votre cas / instruction switch, vous utilisez ces constantes DOG et CAT. Où sont ceux définis?

Vous manquez des pauses, c'est pourquoi votre commutateur ne fonctionne pas. Il devrait ressembler à ceci.

switch (type) {

 case CAT:
   return [Cat new];
 break;
 case DOG:
   return [Dog new];
 break;
 default:
   return [Animal new];
 break;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top