Question

Je me enseigner Objective-C comme un plaisir coupable, si vous voulez. J'ai une connaissance forte auto-proclamé du langage Java, il est donc pas très difficile transition - il est sûr amusant bien. Mais hélas, ma question!

Je tente de reproduire quelque chose qui existe en PHP: La liaison statique tardive. En PHP, je peux décorer un appel de méthode avec « statique :: », qui se lie dynamiquement cette méthode à l'appelant lors de l'exécution. D'autre part, si le mot-clé « self :: » est utilisé, la liaison est statique et est associé à la classe dans laquelle il réside, quelle que soit la classe de l'enfant appelle il.

Dans Obj-C, je la difficulté à reproduire ce paradigme. J'ai demandé à mon suzerain, Google, comment lier fin statiquement à Cocoa, mais je ne pense pas qu'il soit possible. On peut l'appeler autre chose, ou il peut exiger un très sur-ma-tête de contournement. Voici ce que je fais maintenant:

Parent Classe Méthode:

-(id) whoAmI {
 return ([self class]);
}

Une classe enfant, ChildClass, étend ParentClass et ne remplace pas méthode d'instance WHOAMI.

NSLog(@"Calling from PARENT: %@", [parent whoAmI]);
NSLog(@"Calling from CHILD: %@", [child whoAmI]);

Quand j'envoie le message à chacun des objets de classe, la liaison dynamique fait ce qu'il est censé faire, et je reçois les éléments suivants de NSLog ():

2010-09-21 11: 39: 07,484 WhoAmI [4803: a0f] Appel de PARENT: Parent
2010-09-21 11: 39: 07,486 WhoAmI [4803: a0f] Appel d'un enfant: Enfant

En fin de compte, je veux apprendre - si possible - comment obtenir Cocoa pour arrêter la liaison dynamique, de sorte que la méthode WHOAMI retourne toujours l'objet dans lequel il se trouve (toujours Parent). Je veux aussi qu'il soit une méthode d'instance. Comment dois-je prendre?

-Sean

Était-ce utile?

La solution

En fait, Objective C a un puissant ensemble de fonctionnalités d'introspection, et il est certainement possible de faire ce que vous voulez en se référant à une vaste Apple Objectif documentation C Runtime . Ceci est une API complète de C pour accéder aux rouages ??internes de l'objet de l'objectif C et la hiérarchie de classe.

Si rien d'autre, en expérimentant avec ce genre de choses que vous apprendrez beaucoup de choses sur le fonctionnement de la langue et il devrait vous aider dans le débogage des problèmes difficiles.

Autres conseils

Modifier la méthode d'incorporer le nom de la classe parente (ou la superclasse):

-(id) whoAmI {
 return ([Parent class]);    //In this instance, Parent is the superclass
}

Il se trouve que ce que je voulais créer des devait être provoquée par la liaison statiquement mon message de classe à la classe mère elle-même. Parent

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top