Next: Catégories Up: La gestion des messages Previous: Utilisation de super

Redéfinir self

Le mot clef super est simplement un drapeau spécifiant au compilateur ou il doit commencer la recherche de la méthode a réalisée. Par contre self est une variable qui peut être utilisé de nombreuses façons et peut même être affecté d'une nouvelle valeur.

Ce dernier cas ce rencontre fréquemment dans les méthodes de classes. Les méthodes de classes sont en générale concernées par des instances de la classe plutôt que par l'objet class lui même. Par exemple, une méthode peut combiner l'allocation et l'initialisation d'une instance:

+ newTag:(int)anInt return [[self alloc] initTag:anInt];

Dans une telle méthode, il est tentant d'envoyer des messages à l'instance et d'appeler l'instance self, de la même façons que pour une méthode d'instance. Mais ce serais une erreur. En effet self et super tout deux font référence à l'objet receveur, l'objet qui reçoit le message qui lui dit de réaliser une méthode, or dans une méthode d'instance self désigne l'instance mais dans une méthode de class self désigne l'objet classe ! Ainsi pour pouvoir envoyer un message d'application d'une méthode d'instance il faut redéfinir self comme étant une instance :

+ newTag:(int)anInt andColor:(NXColor)aColor self = [[self alloc] initTag:anInt]; [self setColor:aColor]; return self;

La méthode + newTag:andColor: est une méthode de class (signe +) donc initialement self est l'objet classe, c'est cet objet classe qui reçoit le message alloc. self est en suite redéfini pour comme l'instance renvoyée par la méthode alloc et initialisé par initTag:. C'est cette nouvelle instance qui reçoit le message setColor:. Pour éviter toute confusion il est préférable d'utiliser une autre variable que self pour désigner une instance dans une méthode de class:

+ newTag:(int)anInt andColor:(NXColor)aColor id newInstance = [[self alloc] initTag:anInt]; [newInstance setColor:aColor]; return newInstance;

Remarque: Dans ces exemples, la méthode de classe envoi des messages (initTag: et setColor:) pour initialiser l'instance. Elle n'assigne pas de nouvelles valeurs directement dans les variables d'instance comme le fait une méthode d'instance:

tag = anInt; color = NX_REDCOLOR;

Seules les variables d'instance du receveur du message peuvent être positionnée directement. Comme l'objet class n'a pas de variables d'instances, cette syntaxe ne peut être utilisée. Par contre si la variable newInstance avait été typé statiquement, l'affectation directe est possible avec la syntaxe suivante : newInstance->tag = anInt;

Voir "Accès aux Variables d'instance" plus haut.

Next: Catégories Up: La gestion des messages Previous: Utilisation de super

Dominique REVUZ
Vendredi 21 février 1997 17:27:12
Une Bug Un mail Merci