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 5Notez 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 endNotez 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.