[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_glyphec_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;Voilà j'espère ne pas être incompréhensible ou hors-sujet.
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);
merci par avance pour tous vos renseignements...
Partager