Les
classes
La classe est l'unité de
base de la programmation objets. Une classe correspond à la définition d'un
type. Elle peut contenir des variables d'instances (des attributs) qui correspondent
aux données associées au type, c'est-à-dire à sa structure. Elle peut également
comprendre un certain nombre de méthodes (fonctions et procédures) qui s'appliquent
sur ce type. On peut décomposer la structure d'une classe Eiffel en plusieurs
sections.
- La section "class
MA_CLASSE" qui définit le nom du type la section création qui contient
une liste de méthodes pouvant être utilisées pour créer un nouvel objet. En
Java et C++, ces constructeurs portent le nom de la classe, avec des paramètres
éventuellement différents. Ce mécanisme, connu sous le terme de surcharge
("overloading"), n'existe pas en Eiffel.
- Plusieurs sections "feature"
qui contiennent les déclarations de primitives (méthodes et attributs). C++
et Java permettent de contrôler la visibilité de ces déclarations de manière
rudimentaire : elles peuvent être "public" (visibilité et utilisation par
toute autre classe), "private" (utilisables uniquement à l'intérieur de la
classe où elles sont définies), ou encore "protected" (qui étend la visibilité
à toutes les classes d'un même package Java). Java dispose aussi d'un mode
de visibilité par défaut, intermédiaire, entre "public" et "protected". Le
contrôle de visibilité disponible en Eiffel est beaucoup plus précis, puisqu'il
est possible de spécifier des listes de classes ayant la visibilité sur une
méthode ou un attribut. Ainsi, si MA_CLASSE a des primitives "a" et "b" contenues
dans une clause Feature "AUTRE_CLASSE", ces primitives sont accessibles
par tous les objets de type AUTRE_CLASSE, ainsi que ses descendants. L'objet
courant, bien entendu, a toujours accès à toutes ses primitives, donc a "a"
et "b" avec lui-même comme receveur. En revanche, notons qu'un objet de type
MA_CLASS n'a pas accès à "a" et "b" sur les autres objets de type MA_CLASS,
puisque MA_CLASS n'est pas listée dans la clause d'exportation de ces primitives.
Ce mécanisme n'est donc pas limité à quelques niveaux prédéfinis, mais permet
de spécifier tous les niveaux d'exportations possibles, de l'absence d'exportation
à la visibilité totale. Ces deux niveaux extrêmes sont atteints en utilisant
deux classes un peu particulières: NONE et ANY.
- ANY est la
classe la plus haute de l'arbre d'héritage, toute classe héritant implicitement
d'elle. La clause d'exportation "Feature ANY", ou plus brièvement
"feature", signifie que les primitives qu'elle contient sont accessibles
de n'importe où (c'est l'équivalent de "public").
- Symétriquement, la
classe NONE est conceptuellement la classe la plus basse dans l'arbre
d'héritage et "Feature NONE" indique qu'aucune classe extérieure n'a visibilité
sur ses primitives (équivalent de "private").
Ecrivons maintenant en langage
Eiffel une classe représentatives précédentes.


Cette classe définit le
type POINT COLORE. Ce type possè de un constructeur 'make', qui permet d'instancier
un nouveau point. Elle possède 2 coordonnées réelles, x et y, qui sont visibles
(feature {ANY} et une couleur privée (feature {NONE}). La méthode get_couleur
n'est visible que par la classe TEST.
Cet exemple nous a aussi
permis d'introduire l'opérateur d'iristanciation !!,
équivalent du 'new' en C++ et Java, qui permet de créer un objet. Par défaut,
en Eiffel, toutes les variables, d'instances ou locales, sont initialisées à
0 ou à Void (l'équivalent du NULL de C). Il faut aussi remarquer que,contrairement
à C/C++/Java qui utilisent le mot clé "return" pour renvoyer le résultat d'une
fonction, la valeur de retour d'une fonction Eiffel doit être stockée dans une
variable Result définie implicitement. La
section 'local' d'une méthode permet de
définir des variables locales. On peut aussi remarquer qu'Eiffel utilise la
notation pointée (comme en Java) pour accéder à une variable d'instance (ici
p.x) ou appeler une méthode (p.translate).
Cependant, alors que Java
et C++ persistent à imposer la présence de parenthèses aux fonctions sans argument,
Eiffel supprime cette contrainte.
Ce type de mécanisme
contribue à renforcer l'implementation hiding (masquage de l'implantation)
qui est un concept fondamental de la programmation objets. C'est en effet un
bon moyen d'assurer la réutilisabilité du code : le changement d'une méthode
en attribut peut alors se faire sans avoir besoin de modifier les appels dans
les classes clientes.
Les
Classes Abstraites >>