2010-07-09 10 views
0

En Objective-C, il y a la métaphore Alloc/Init. Ils ont également ajouté une méthode de partage commune appelée «nouveau» qui appelle en interne les deux à la fois. Et si je crée une sous-classe de NSObject appelée FooClass, FooClass récupère ces méthodes partagées, y compris 'new'.Récupère le type de classe dans la méthode objective-c partagée?

MAIS ... comment diable est-ce mis en œuvre ??

Il ne peut pas simplement déléguer à la classe de base, car cela ne ferait qu'instancier une instance de NSObject, pas votre classe dérivée FooClass, mais cela fonctionne toujours! Alors, comment quelqu'un pourrait-il écrire quelque chose de similaire?

En d'autres termes, la classe de base ne doit pas être ça ...

+ (id) somethingLikeNew{ 
     return [[NSObject alloc] init]; 
    } 

Mais plutôt ce ...

+ (id) somethingLikeNew{ 
     return [[<SomethingThatMapsToFooClassType> alloc] init]; 
    } 

... où 'SomethingThatMapsToFooClassType' est le type de la classe dérivée qui hérite de NSObject et qui a besoin de récupérer la méthode partagée 'somethingLikeNew'. Fondamentalement, j'ajoute une catégorie hors de NSObject et j'ai des méthodes partagées qui doivent connaître le type, mais les implémentations sont toutes génériques, donc aller dans une catégorie sur NSObject et pas partout dans mes fichiers de classe (De la même façon que vous n'avez pas de «nouveau» partout, c'est juste là.)

Quelqu'un? Bueller? Bueller?

M

Répondre

7

De toute méthode Objective-C, le paramètre se réfère au récepteur self (implicite). Dans le cas d'une méthode de classe, self est l'objet Class. Donc, les méthodes de classe polymorphes peuvent être mises en œuvre comme

+ (id)somethingLikeNew 
{ 
    return [[self alloc] init]; 
} 
+0

Lol ... Je suppose que nous avons publié en même temps. Je viens de dire ça moi-même! – MarqueIV

+0

Il est toujours préférable de trouver la réponse vous-même. Bon travail. –

0

Ha! J'ai trouvé moi-même deux secondes après avoir posté ça! Vous pouvez utiliser « auto » dans une méthode commune pour représenter le type de classe pour la classe dérivée, de sorte que le serait simplement ci-dessus ...

+ (id) somethingLikeNew{ 
     return [[self alloc] init]; 
    } 

Bon sang, qui était facile! J'espère que ceci aide quelqu'un d'autre!

M