2015-09-14 1 views
0

J'ai une classe racine et un nombre de classes enfants. J'ai aussi une classe DataManager censée contenir des méthodes statiques dans diverses catégories qui agissent sur un enfant particulier de cette classe racine. Supposons que pour la classe racine R, les classes enfants sont C1 & C2.Comment les appels de méthodes sont-ils résolus par argument dans les classes de catégories en Objective C?

Pour C1, j'ai une catégorie appelée DataManager + C1.
Pour C2, j'ai une catégorie appelée DataManager + C2.

J'ai une classe DataManager de base où j'ai déclaré cette méthode - d'où il est accessible partout - et il n'y a pas d'autres déclarations:

//DataManager.h 
+ (NSDictionary *) Method1 : (DataModelRoot*) R; 
//Note that R is my root class. Individual class implementations belong to DataManager+C1.m, DataManager+C2.m etc. 

La mise en œuvre de Method1 réside dans DataManager + C1 ainsi que DataManager + C2.

Mais je ne vois pas de comportement polymorphe. En d'autres termes, lorsque l'appel Méthode1 de DataManager + C2 est attendu, celui de DataManager + C1 est appelé, bien que l'appel lui-même démarre à partir du fichier source DataManager + C2. (l'appelant peut être n'importe quelle catégorie DataManager - c'est un cas extrême).

Comment le nombre de catégories sur les objets situés dans la même hiérarchie de classe résout-il les appels de fonction?

PS: Notez à nouveau, que la méthode ci-dessus Method1 est seulement dans le fichier .h EXPOSE d'une classe (DataManager.h ordinaire) avec classe racine comme argument. Je suppose que cela assurera une invocation correcte en utilisant le type d'objet enfant, mais cela échoue.

+1

Comment appelez-vous la méthode de classe? Veuillez poster le code de l'invocation actuelle. –

Répondre

1

Objective-C prend en charge le polymorphisme sur les méthodes de classe lorsque la cible du message est réellement polymorphe.

Exemple:

[DataManager Method1:nil]; 

... serait pas sélectionner une cible polymorphically parce que la cible est la classe concrète DataManager. Il enverrait toujours le message à l'implémentation dans DataManager.

Si, en revanche, la cible est dynamiquement déterminée, il existe un polymorhisme réel comme prévu. Un exemple typique est une implémentation de la méthode d'instance dans la même classe ou une sous-classe:

- (void)foo 
{ 
    [[self class] Method1:nil]; 
} 

Ce serait en effet appeler le plus proche de la mise en œuvre surchargée de Method1: et accordant ainsi le comportement polymorphique. Note: Le comportement décrit ci-dessus n'est pas affecté par les catégories. À condition qu'il n'y ait pas de conflit de noms, les catégories ont peu d'influence sur la manière dont les messages sont distribués.

+0

+1 merci. Est-ce que faire de Method1 une méthode d'instance de DataManager réaliser ce que je désire? Quel est le moyen d'atteindre le polymorphisme par argument?J'ai des catégories DataManager définies pour chaque sous-classe de R et il n'est pas possible de dériver DataManager lui-même - du moins à ce stade. –

+1

Je ne suis pas sûr de ce que vous voulez dire par "polymorphisme par argument". Objective-C fournit le polymorphisme en envoyant sur le premier argument (la cible du message). Cela ne vous donne pas ce que certaines langues appellent "envoi multiple". En outre, objc n'a pas de surcharge (ce qui est complètement différent). –