“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 247 — #257
i
i
i
i
i
i
i
i
5.5 Le polymorphisme
247
fun {NewCollection}
S1={NewStack}
...
proc {Union C2}
{DoUntil C2.isEmpty
proc {$} {S1.push {C2.get}} end}
end
in
collection(... union:Union)
end
Cette implémentation utilise la représentation interne de C1 mais l’interface externe
de C2. C’est une différence cruciale avec le style ADT ! Pouvons-nous faire une
implémentation en style objet qui utilise les deux représentations internes, comme
nous l’avons fait dans le cas ADT ? La réponse est simplement non, pas sans casser
l’encapsulation de l’objet C2.
Pour compléter le cas objet, voici une implémentation objet qui n’utilise que les
interfaces externes :
fun {NewCollection}
...
proc {Union C2}
{DoUntil C2.isEmpty
proc {$} {This.put {C2.get}} end}
end
This=collection(... union:Union)
in
This
end
Remarquez que l’objet C1 fait référence à lui-même avec la variable This.
5.5.4 Discussion
Comment choisir entre les styles ADT et objet ? Il faut les comparer :
– Le style ADT peut être plus efficace parce qu’il permet l’accès aux deux représentations internes. L’utilisation d’une interface externe peut être moins efficace
si elle n’a pas toutes les opérations nécessaires.
– Parfois le style ADT est le seul qui soit bon. Supposons que nous définissions
un type entier et que nous voulions définir l’addition de deux entiers. Si aucune
autre opération n’est définie sur les entiers, il faudra un moyen pour accéder aux
représentations internes. Par exemple, la représentation pourrait être en binaire
© Dunod – La photocopie non autorisée est un délit
Précédent

- 262/370

Suivant