2010-07-09 6 views
0

Tout ce que je savais est ceci: Objective-c nous permet de transmettre l'invocation de la méthode à sa super classe par [super méthode] Cependant, je veux transférer l'invocation à super.super; Sauter la super classe immédiatement. En C++, nous pouvons facilement faire cela en typant (objet (GrandSuper *)) .method().En Objective-C, comment on peut transmettre la méthode à la super classe spécifique

est leur toute disposition à faire de même dans l'objectif c

+4

Le premier question serait pourquoi? Si vous devez le faire dans ObjC, vous avez probablement un problème de conception. –

+2

Notez qu'en C++, il est plus sûr d'éviter le typage et d'utiliser ceci à la place: 'object.GrandSuper :: method()' –

+0

La meilleure chose à faire serait de re-concevoir votre modèle d'objet pour ne pas avoir à le faire. – JeremyP

Répondre

3

Il est probablement une mauvaise idée de le faire, bien qu'il soit possible. Vous voulez probablement penser à une meilleure façon de réaliser tout ce que vous essayez de faire.

Supposons que vous avez trois classes: Cat qui hérite de Mammal qui hérite de Animal.

Si vous êtes dans la méthode -[Cat makeNoise], vous pouvez sauter -[Mammal makeNoise] et appelez -[Animal makeNoise] comme ceci:

-(void) makeNoise; 
{ 
    void(*animalMakeNoiseImp)(id,SEL) = [Animal instanceMethodForSelector:@selector(makeNoise)]; 
    animalMakeNoiseImp(self, _cmd); 
} 
+0

Merci, Je voulais juste une solution rapide. – shakthi

3

Je pense que vous devez use objc_msgSendSuper directly, à savoir

#include <objc/message.h> 
... 

struct objc_super theSuper = {self, [GrandSuper class]}; 
id res = objc_msgSendSuper(&theSuper, @selector(method)); 
+0

Faites attention si le sélecteur renvoie une structure. Vous aurez besoin de savoir si utiliser 'objc_msgSendSuper' ou' objc_msgSendSuper_stret', ce qui n'est pas toujours simple. –

0

Je pense que vous pouvez aussi simplement appeler le super de super:

[[[self super] super]functionOfInterest]; 
Questions connexes