Next: La portée des variables Up: Définir une classe Previous: L'implémentation

Accès aux variables d'instance

Par défaut, les variables d'instances d'un objet sont dans la portée des méthodes de cet objet. Elles sont simplement utilisables par leur nom. Bien que le compilateur fabrique une structure équivalente aux structures du C pour stocker ces variables, la structure réelle est cachée. Il n'est donc pas nécessaire d'utilisé les opérateurs de champ (.) ou les indirections (->) pour manipuler les données de l'objet. Par exemple, la définition de méthode suivante manipule la variable d'instance tag du receveur:

- setTag:(int)anInt
{
tag = anInt;
. . .
}
Ni l'objet ni sa variable d'instance tag ne sont déclarés comme argument de la méthode, pourtant elles sont dans la portée de la méthode. Ceci simplifie la syntaxe des méthodes et permet un raccourci utile dans l'écriture des sources en ObjectiveC.

Les variables d'instance de la classe de l'objet ne sont pas les seules auxquelles une méthode peut référer. En effet, la méthode peut manipuler toutes les variables d'instance définies dans sa généalogie, aussi longtemps que deux conditions sont vérifiées:

Quand la variable d'instance appartient au receveur (comme dans la méthode setTag:), il n'y a pas de problèmes. Le receveur est implicite mais évident, c'est ce type que définie la classe. Quand la variable d'instance n'appartient pas au receveur, alors le type de l'objet doit être explicité pour le compilateur par du typage statique. Dans ce cas on utilisera l'opérateur d'indirection (->). Supposons par exemple que la classe NouvelleClasse déclare une variable statiquement typé dans ses variables d'instance:

@interface NouvelleClasse : Object
{
NouvelleClasse *compagnon;
int tag;
char *name;
}
Tant que les variables d'instance de l'objet sont dans la portée (comme ici), une des méthodes de NouvelleClasse peut les modifier directement:

- creerCompagnon
{
if ( !compagnon ) {
compagnon = [[NouvelleClasse alloc] init];
compagnon->tag = tag;
compagnon->name = name;
}
return compagnon;
}

Next: La portée des variables Up: Définir une classe Previous: L'implémentation

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