Bonjour yndigos,
Comment assigner (est-ce le bon terme) ou copier le contenu d'une liste typée "générique" à ou dans mon objet enfant liste dictionnaire (lstDictionnaire).
Je ne comprends pas le problème, pour la raison suivante : la liste typée du projet doit être "typée" (on choisit une classe de base) dès son instanciation (c'est le paramètre du constructeur qui donne le type). Une liste "générique" ne peut pas exister en exécution.
Je vais reprendre la définition de votre dictionnaire, afin d'éclaircir le terrain.
Je me permets un parallèle avec C#, la déclaration en windev :
- Code: Tout sélectionner
lstDictionnaire est une CL_TypableElementCollection(allouer un ENTITE)
correspond (en très très gros
) à :
List<ENTITE> lstDictionnaire = new List<ENTITE>();
L'objet Windev lstDictionnaire est bien une liste d'ENTITE, pouvant aussi accepter les dérivés d'ENTITE.
Maintenant, fonctionnellement parlant la liste typée seule ne suffit pas, vous voulez des fonctionnalités supplémentaires propres à un dictionnaire. On peut y arriver de deux façons :
héritage simple, ou bien
composition (au sens UML).
Partons pour l'héritage simple, écrivons le code de la classe Dictionnaire (attention j'ai pas testé) :
- Code: Tout sélectionner
Dictionnaire est une classe
hérite de CL_TypableElementCollection // héritage simple, PUBLIC par défaut
FIN
Procedure Constructeur()
CL_TypableElementCollection:Constructeur(allouer une ENTITE) // appel du constructeur ancêtre, je privilégie cette syntaxe
// et après j'ajoute / je surcharge les fonctions qui m'intéressent...
// pour exemple :
Procedure TousLesElementsCommencantParA() : chaine
lc_Resultat est une chaine
lpo_Entite est une ENTITE Dynamique
:Premier()
TANTQUE :Courant(lpo_Entite)
SI lpo_Entite:CommencePar("A") ALORS // trop forte cette Entite...
lc_Resultat += lpo_Entite:Contenu()
FIN
:Suivant()
FIN
RENVOYER lc_Resultat
Là on a un dictionnaire qui
est une liste typée verrouillée sur le type de base : ENTITE, avec des fonctions de dictionnaire qui travaillent
sur ses propres éléments (du Dictionnaire).Dictionnaire
gère son contenu comme un CL_TypableElementCollection.
La composition, que je privilégie (principe d'encapsulation, pas de hiérarchie de classes en cascades, plus simple à maintenir)
- Code: Tout sélectionner
Dictionnaire est une classe
PRIVE // de cette manière on considère que dictionnaire est pleinement responsable de son contenu (ce qui est le mieux du point de vue POO, dans le cas contraire utiliser le mot-clé PUBLIC)
lstEntites est une CL_TypableElementCollection(allouer une ENTITE) // 'lstEntites' à la place de 'lstDictionnaire' pour une meilleure sémantique
FIN
// et après j'ajoute les fonctions qui m'intéressent... et qui vont travailler sur mon membre lstEntites.
// pour exemple :
Procedure TousLesElementsCommencantParA() : chaine
lc_Resultat est une chaine
lpo_Entite est une ENTITE Dynamique
:lstEntites:Premier()
TANTQUE :lstEntites:Courant(lpo_Entite)
SI lpo_Entite:CommencePar("A") ALORS // trop forte cette Entite...
lc_Resultat += lpo_Entite:Contenu()
FIN
:lstEntites:Suivant()
FIN
Là on a un dictionnaire qui
a une liste typée verrouillée sur le type de base : ENTITE, avec des fonctions de dictionnaire qui travaillent
sur les éléments de la liste typée (du Dictionnaire).Dictionnaire
délègue son contenu à un membre de type CL_TypableElementCollection.
Avec une des deux méthodes vous disposez maintenant d'un dictionnaire pleinement fonctionnel.
J’espère avoir pu répondre à votre problème.
Sinon, avez toujours besoin de copier des éléments d'une liste à une autre ? si c'est le cas je referais un autre post.
En vous souhaitant un bon développement.