2010-12-04 7 views
0

Je viens de découvrir MacRuby cet après-midi; l'homme est toujours COOL! Cependant, j'ai rencontré quelques difficultés en tentant de prolonger un ancien projet avec du MacRuby-fu. Voici l'affaire:Initialiseurs personnalisés MacRuby

j'ai donc une superclasse en Objective-C qui ressemble à ceci:

@implementation Foo 
- (id) init { 
    if (self = [super init]) { 
     //Do nothing, don't have enough data... 
    } 
    return self; 
} 

- (id) initWithName:(NSString*)n andLocation:(NSString*)loc andSomethingElse:(Bar*)b { 
    if (self = [super init]) { 
     //Set a LOT of internal state... 
    } 
    return self; 
} 
@end 

Ainsi, dans un fichier ruby, nous l'appellerons Mung.rb qui ressemble à ceci:

class Mung < Foo 
    def initWithSomethingElse(else, andEvenMore:more) 
     super.initWithName("Moop", andLocation:else, andSomethingElse:more.addVal(42)) 
     self 
    end 
end 

Quand je vais à instancier un Mung (myObj = Mung.alloc.initWithSomethingElse ("Boo", andEvenMore: "US"), l'environnement d'exécution explose en me disant il n'y a pas de méthode définie dans le super appelé Mung 'initWithSomethingElse' Cela est vrai, mais cela signifie que je ne peux pas définir d'initialiseurs personnalisés dans les fichiers ruby. round est de fournir un initialiseur homogène qui prend un hachage, puis les sous-classes individuelles analyser le hachage au besoin. Je n'aime pas cette approche et aimerais: A. Une explication de la raison pour laquelle 'initWithSomethingElse' est jamais appelée sur super, et B. Si aucune solution directe ne peut être appliquée, une solution alternative. Merci les gars!

Répondre

1

Vous ne pouvez pas appeler la super version d'une méthode différente d'une méthode dans MacRuby. Le mot-clé super respecte la sémantique Ruby et envoie seulement un appel à la super-version de la méthode en cours.

Dans votre cas, vous pouvez envoyer initWithName: andLocation: andSomethingElse: à self directement, et si nécessaire, vous pouvez redéfinir ce sélecteur sur la classe et appeler de façon appropriée.

+0

Eh bien, je me sens bête. J'ai même pensé à cette solution après mon coucher hier soir. Certainement aurait dû essayer d'appeler soi-même d'abord ... Merci pour l'aide! – Grimless

Questions connexes