next up previous
Next: Référencement aux classes parentes: Up: Héritage Previous: Re-définition

Auto-référencement: self

L'auto-référencement est la possibilité pour une méthode d'utiliser les autres méthodes (ou méthodes soeurs) qui se trouvent dans un objet. Considérons une autre version de la classe cell où l'on incorpore la nouvelle méthode double. Dans cette dernière, on utilise la méthode set de la même classe4.

class cell =
 object(self)
     val mutable cont = 0
     method get  = cont
     method set n = cont <- n 
     method double = self#set (cont*2) 
     method print = print_int self#get
 end;;

Nous ne pouvons pas employer set qu'au moyen d'un envoi de message. Or, au moment de définir la classe, il n'y a pas encore d'objet qui en soit une instance! En revanche, une invocation future de double se fait par o#double, via un certain objet o, dit objet courant. Quoi de plus normal que d'aller chercher, pendant l'exécution de double, le code de sa méthode soeur dans cet objet? On utilise souvent le mot self pour parler de l'objet courant. En Ocaml, lors de la définition d'un classe, on peut donner un nom quelconque à cet objet, au moyen de la construction object(ident). Nous preférons utiliser la terminologie objet et l'appelons toujours self. Dans notre exemple, la méthode d'affichage utilise également une méthode soeur (get) via self.

# let c = new cell;;
val c : cell = <obj>

# c#set 1;;
- : unit = ()

# c#print;;
1- : unit = ()

# c#double;;
- : unit = ()

# c#get;;  
- : int = 2

# c#print;;
2- : unit = ()

De manière générale, il est pratique d'avoir accès aux méthodes soeurs d'une classe, mais là où réside la veritable puissance de l'auto-reférencement c'est dans son caractère dynamique: l'objet reférencé par self n'est pas d'une classe figée. Dans notre exemple, il peut être de classe cell ou d'une de ses sous-classe. Ceci implique que le comportément des méthodes invoquées avec self peut varier dynamiquement (selon la classe effective de self). Il s'agit là d'un problème de liaison des variables (ici les méthodes), que nous étudierons un peu plus loin dans la partie dediée à la liaison tardive.


next up previous
Next: Référencement aux classes parentes: Up: Héritage Previous: Re-définition
Maria-Viginia Aponte
2001-03-28