Séance 6
Objets, classes et polymorphisme

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

Enoncés des exercices

  1. 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]
    

  2. 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.

Exercice individuel

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.

Sélectionnez maintenant le nom de votre tuteur dans la liste :


Raphaël Collet et Luis Quesada - 12 novembre 2004