previous up next top index
Précédent : Mixins Remonter : Actions de recherche Suivant : Ergonomie


Héritage

En termes de spécifications, deux mécanismes existent pour créer une classe nouvelle à partir de classes existantes. Le premier, appelé composition, combine les graphes colorés de plusieurs classes de base (superclasses) ; toutes les dimensions distinctes sont combinées (produit cartésien). Le second mécanisme est la dérivation ; en ce cas, il y a normalement ajout d'une ou plusieurs dimensions (celles du mixin) seulement en un seul point de l'espace de base. Une hiérarchie de classes résulte de ces mécanismes.

En termes d'implémentations, notre proposition développe le concept d'héritage dans une hiérarchie par extension progressive du concept d'héritage local. Appelée « héritage par dimensions », son principe consiste en une recherche des items (micro-méthodes, représentations en mémoire) selon chaque dimension « impliquée ». Concernant les représentations en mémoire, les dimensions non abstraites sont toutes impliquées ; de plus, les contraintes habituelles rendent la solution aisée. Concernant les micro-méthodes, les dimensions impliquées sont celles de la transition correspondante. Etant donnée une dimension impliquée, la recherche est faite selon la linéarisation des classes affectant cette dimension. Le résultat est un « diagramme d'invocation » listant les méthodes selon toutes les dimensions impliquées et, s'il y a lieu, selon les dimensions utilisées (par une telle méthode) mais non impliquées (par la transition) : par exemple, pour réaliser une impression, la transition correspondante (définie dans la classe Objet ) implique seulement la dimension objet, tandis que la méthode fait généralement appel à toutes les autres dimensions. Si une certaine condition (dite de « régularité ») est vérifiée, alors le diagramme d'invocation peut être mis sous la forme d'une liste d'arbres : chaque arbre est dû à une ou plusieurs listes de méthodes, listes initialement parallèles (elles traversent les mêmes classes), puis progressivement divergentes. Une hiérarchie est « régulière » vis-à-vis de ses méthodes m si toutes les méthodes m de degré supérieur ou égal à K qui existent selon une même dimension satisfont les mêmes K dimensions. (Cette condition est vérifiée en pratique.) L'ordre original des méthodes selon chaque dimension est éventuellement remanié de manière à privilégier les méthodes les plus spécialisées par rapport à celles qui le sont moins (règle de prévalence des méthodes combinant un plus grand nombre de dimensions), d'où la structure en liste d'arbres. Il est bien sûr possible de masquer explicitement des méthodes, d'ailleurs d'une manière plus fine que dans les langages à objets traditionnels. Les méthodes ainsi ordonnées et retenues sont combinées selon deux combinaisons a priori distinctes : la première est utilisée le long d'une même branche ; la seconde, quand des branches divergent. Ceci constitue la technique de base. L'ajout de mots-clés aux déclarations des méthodes permet des combinaisons plus sophistiquées. Non seulement notre proposition généralise ainsi celle de CLOS au cas des objets ayant des états, mais elle permet en outre un style purement déclaratif : le style impératif (``call-next-method''), non modulaire (nécessité d'examiner le corps des méthodes), est évacué. Concernant la linéarisation, nous avons été amenés à définir une nouvelle propriété, la « congruence », qui implique que la linéarisation de toute sous-hiérarchie de racine C0 et de sommet C soit une sous-liste de la linéarisation de la hiérarchie de racine C0. Nous avons montré que l'algorithme de linéarisation de LOOPS était congruent et qu'un algorithme de linéarisation aveugle ne pouvait être à la fois monotone et congruent. Nous avons également élaboré un nouvel algorithme de linéarisation monotone.



previous up next top index Précédent : Mixins Suivant : Ergonomie Remonter : Actions de recherche