[DESIGN PATTERN] / [Patron / Modèle de Conception] [ENUMERATEUR]
[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 ... :P)
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_Feuille c_Glyphe_compositec_glyphe_codebarre c_liste_vecteurs
c_glyphe_vecteur c_liste_points
c_glyphe_point
Code déclaration ENUMERATEUR
Code:
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:
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:
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...
[DESIGN PATTERN] / [Patron / Modèle de Conception] [ENUMERATEUR]
Merci à WolffN d'avoir accepter de me répondre.
Je n'ai pas lâché l'affaire et j'ai pris une bonne nuit de sommeil , et surtout beaucoup de recul pour relire mon code...
Le problème était bien mon mauvais codage... honte sur moi ...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
//Ancienne version de fonction GetCourant
function c_EnumerateurGlypheComposite.GetCurrent : c_Glyphe;
begin
result := _GlypheComposite.Get(_Index); // cette affectation fige-t-elle le type de mon objet? (Transtypage??)
end;
//Nouvelle version de fonction GetCourant
function c_EnumerateurGlypheComposite.GetCurrent : c_Glyphe;
var
l_glyphe : c_glyphe;
begin
l_glyphe := _GlypheComposite.Items[CURSEUR];
result := l_glyphe; // c'est désormais une adresse.. et non plus une structure figée....
end; |