[DESIGN PATTERN] / [Patron / Modèle de Conception] [ENUMERATEUR].

Bonjour à tous.

Je suis en train d'apprendre à utiliser les modèles de conceptions.
Jusqu'à présent je pense avoir à peu près cerné diffèrents types de modèles.

merci à http://castelain.developpez.com/sources/Bouboules/
c'est un très bon exemple du modèle OBSERVATEUR.

J'essaye d'implanter un énumerateur dans une liste composée.


Ma boucle avec énumerateur énumère bien l'ensemble des éléments de la liste composée.
Mais les objets dessinés (énumérés) sont tous de type glyphe "PUR" (la classe abstraite).
Je perd donc l'avantage de la liste composée me permettant de stocker différents types d'objets.
Le code n'utilise pas la procédure en fonction du type de l'objet....

Un énumerateur ne peut-il énumérer qu'un seul et même type d'objet?
Ai-je mal compris ou codé? (fort probable ... )
L'affectation dans la procédure GETCURRENT fige-t-elle le type d'objet ?
Est-ce une limitation du modèle ENUMERATEUR?
Pourquoi cette limitation à un type figé d'objet?

Où trouver un lien vers plus d'informations, ou un exemple, concernant ce modèle?

Pour info voici une architecture de mes objets glyphes
c_glyphe
/ \
c_Glyphe_Feuille c_Glyphe_composite
| |
c_glyphe_codebarre c_liste_vecteurs
c_glyphe_vecteur c_liste_points
c_glyphe_point



Code déclaration ENUMERATEUR
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
  c_EnumerateurGlypheComposite  =  class
      private
        _Index            :  Integer;
        _GlypheComposite  :  c_GlypheComposite;
 
        function GetCurrent: c_Glyphe;
 
      Protected
      Public
        constructor Create(UnGlypheComposite  :  c_GlypheComposite);
 
        function PointeSuivant    (inc  :  Integer  =  1)  :  Boolean;
 
        function PointePrecedent  (dec  :  Integer  =  1)  :  Boolean;
 
//        function PointePremier  :  Boolean;
//        function PointeDernier  :  Boolean;
 
      Published
 
        property Courant: c_Glyphe read GetCurrent;
 
    end;


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
{ c_EnumerateurGlypheComposite }
 
  constructor c_EnumerateurGlypheComposite.Create(UnGlypheComposite: c_GlypheComposite);
    begin
      _Index  :=  -1;
      _GlypheCOmposite  :=  UnGlyphecomposite;
    end;
 
  function c_EnumerateurGlypheComposite.PointeSuivant(inc: Integer  =  1): Boolean;
    begin
        result := ((_Index + inc )< (_GlypheComposite.Count-1));
 
        If result
          then _Index  :=  _Index  +  inc;
    end;
 
  function c_EnumerateurGlypheComposite.PointePrecedent(dec: Integer  =  1): Boolean;
    begin
        result  :=  ((_Index  -  dec)  > 0);
        If Result then _Index  :=  _Index  -  dec;
    end;
 
  function c_EnumerateurGlypheComposite.GetCurrent  :  c_Glyphe;
    begin
      result := _GlypheComposite.Get(_Index);    // cette affectation fige-t-elle le type de mon objet? (Transtypage??)
    end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
  procedure c_GlypheComposite.dessine(p_zone_dessin: c_zone_graphique);
    var
      l_i,l_max    :  Integer;
//      g  :  c_EnumerateurGlyphecomposite;
    begin
      inherited;
//      g  :=  enumerateur;  // création de mon enumerateur...
      l_max    :=  COUNT-1;
 
//      while g.PointeSuivant() do g.Courant.dessine(p_zone_dessin);  // Pourquoi les deux boucles ne réagissent pas de la même manière? 
 
// Pourquoi l'énumerateur ne me permet-il pas de pointer sur la procédure fonction du type d'objet???
 
      for l_i := 0 to l_max do Items[l_i].dessine(p_zone_dessin);
 
    end;  //c_GlypheComposite.dessine(p_zone_dessin: c_zone_graphique);
Voilà j'espère ne pas être incompréhensible ou hors-sujet.
merci par avance pour tous vos renseignements...