| Informatique T4 - Page des travaux pratiques - Environnement de développement - Syntaxe de Oz |
Dans cette séance, nous allons définir des objets à partir de classes, et mettre en évidence le concept de polymorphisme. L'exemple ci-dessous rappelle la syntaxe d'une classe, la creation d'un objet et son utilisation.
declare
class Counter
attr value
meth init % (ré)initialise le compteur
value:=0
end
meth inc % incrémente le compteur
value:=@value+1
end
meth get(X) % renvoie la valeur courante du compteur dans X
X=@value
end
end
MonCompteur={New Counter init}
for X in [65 81 92 34 70] do {MonCompteur inc} end
{Browse {MonCompteur get($)}} % affiche 5
Notez la présence du signe $: l'expression
{MonCompteur get($)} est équivalente à
local X in {MonCompteur get(X)} X end
Séquences.
Une séquence est une collection d'éléments dans un ordre donné.
Un objet implémentant une séquence doit avoir une méthode
getElements(L), qui lie L à la liste des
éléments dans la séquence.
Les piles et les files sont des cas particuliers de séquences.
Définissez les classes Stack et Queue en
utilisant les techniques proposées dans la
séance 5.
Vos classes doivent définir des séquences, c'est-à-dire qu'elles doivent
implémenter la méthode getElements(L).
Exemple d'utilisation:
declare
S={New Stack init}
Q={New Queue init}
{S push(a)}
{S push(b)}
{Q enqueue(a)}
{Q enqueue(b)}
{Browse {S getElements($)}} % affiche [b a]
{Browse {Q getElements($)}} % affiche [a b]
Collections.
Une collection regroupe des valeurs. Voici une classe qui
implémente des collections. Trois méthodes sont définies:
put(X), get(X) et isEmpty(B).
class Collection
attr elements
meth init % initialise la collection
elements:=nil
end
meth put(X) % insère X
elements:=X|@elements
end
meth get($) % extrait un élément et le renvoie
case @elements of X|Xr then elements:=Xr X end
end
meth isEmpty($) % renvoie true ssi la collection est vide
@elements==nil
end
end
Notez que par défaut, le corps d'une méthode est une instruction. Mais
la notation $ permet de définir des méthodes comme des
fonctions. Leur contenu doit être une expression qui décrit la valeur
renvoyée. Dans l'exemple, la méthode put(X) est définie
par une instruction, tandis que la méthode isEmpty($) l'est
par une expression.
Ajoutez une méthode union(C) à cette classe. L'appel
{C1 union(C2)} fait l'union des collections
C1 et C2. Après l'appel, C1
contient cette union et C2 est vide. Votre méthode doit
être polymorphe, c'est-à-dire qu'elle ne doit pas dépendre
des implémentations des objets concernés.
Définissez maintenant une classe SortedCollection
pour des collections triées. L'interface d'une collection
triée est la même qu'une collection, à la différence près que la
méthode get(X) renvoie les éléments dans l'ordre du tri.
En d'autres mots, la méthode renvoie toujours l'élément le plus petit
de la collection. Votre classe doit hériter de la classe
Collection.
Utilisez votre classe SortedCollection pour trier une
liste. Votre implémentation correspond-elle à un des algorithmes de
tri vus dans la séance 3?
Pouvez-vous facilement convertir une collection quelconque en une collection triée?
Remplissez le formulaire avec votre réponse, ensuite sélectionnez votre tuteur dans la liste. Une fenêtre apparaîtra avec le contenu d'un e-mail que vous devrez envoyer.