|
| Recherche dans un tableau d'intance d'interface |
| Débuté par AZIZ AIT ZAGHAR, 26 juil. 2025 13:33 - 4 réponses |
| |
| | | |
|
| |
Membre enregistré 29 messages |
|
| Posté le 26 juillet 2025 - 13:33 |
Bonjour à tous,
Est-ce que quelqu'un a déjà manipulé des tableaux d'interfaces ?
J'ai des classes qui implémente l'interface I_Composite et d'autres qui Implémentent l'interface I_Composant dans le cadre du design pattern Composite.
Je manipule donc des composites et des composants :
CProduit_configuré est une Classe implémente I_Produit implémente I_Produit_simple implémente I_Produit_Configuré implémente I_Composant hérite de MProduit
PROTÉGÉ m_i_Tableau_de_paramètre est un I_Composite <note="I_Composite:MParamètre">
MTableau_de_paramètre est une Classe implémente I_Composite hérite de CComposite
PROTÉGÉ m_tab_i_Paramètre est un tableau de I_Composant <note="I_Composant:MParamètre"> FIN
Mon problème est que quand je tente de faire une recherche dans un tableau inclus dans Composite ça ne marche pas :
n_PositionComposant est un entier = Cherche(i_Composite_paramètre:p_tab_i_Composant,tcLinéaire,"p_na8_ID_Paramètre",n8_IDParamètre)
J'ai la solution qui fonctionne mais je ne trouve pas ça très élegant :
n_PositionParamètre est un entier = 1
POUR TOUT Item de i_Composite_paramètre:p_tab_i_Composant SI {Item,"p_na8_ID_Paramètre"} = n8_IDParamètre ALORS SORTIR FIN n_PositionParamètre ++ FIN
Quelqu'un aurait une explication / solution ou dois-je me résoudre à rester sur la solution de la boucle ?
Par avance merci
AzieMessage modifié, 26 juillet 2025 - 13:33 |
| |
| |
| | | |
|
| | |
| |
| Posté le 28 juillet 2025 - 10:44 |
Tu éffectues ta recherche dans une méthode de ta classe ou en dehors ?
Ton Tableau a une portée "protégée"
Il n'est accessible qu'à partir du code de ta classe et ses enfants (petit rappel au cas où) |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 318 messages |
|
| Posté le 30 juillet 2025 - 05:48 |
Bonjour, "ça ne marche pas" ça ne veut rien dire. Il y a une erreur ? Le résultat obtenu n'est pas celui escompté? .... Par ailleurs, il nous manque une grosse partie de tes déclarations, MProduit, I_Composite, I_Composant, CComposite, i_Composite_paramètre ......
A priori, étant donné le préfixe (p_,) p_tab_i_Composant est un getter (proprité lecture,) est elle bien déclarée ou n'existe-t-elle que dans une de tes interfaces ?
-- Il y a peut être plus simple, mais, ça tourne Quand tout a échoué, utilise l'option RTFM |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 29 messages |
|
| Posté le 07 août 2025 - 09:37 |
Bonjour et merci pour vos réponses,
Pour commencer, désolé pour le délai pour continuer cette discutions ! c'était ma semaine de vacances de l'année 
Pour codeur : Je fait les choses en dehors de la classe et le composite et bien accessible tout comme les composants pour peut que je passe par une instance d'Interface I_Composant ou I_Composite.
Pour Voroltinquo : Effectivement tu as raison "ça ne marche pas", ça ne veux rien dire. J'entends par là, la valeur recherchée existe bien dans dans un composant du tableau d'interface mais la fonction Recherche() ne la trouve pas et retourne -1 pas d'erreur.
J'ai une interface composite : i_Composite qui est l'interface dans laquelle je peux mettre n'importe quel instance de type tableau de classe avec tous les comportements (ajout, suppression, totalisation ...)
J'ai une interface composant : I_Composant qui est l'interface dans laquelle je peux mettre n'importe quel classe Modèle ou classe non mappée (CProduit_configuré par ex.)
Au lieu de manipuler les classe concrètes, MTableau_de_paramètre, MTableau_de_nom_paramètre, ... ce qui d'après ce que j'ai compris des principes SOLID créerait une dépendance forte. J'utilise donc une instance d'interface (i_Composite_paramètre dans l'exemple qui va suivre) dans laquelle je pourrai avoir, MTableau_de_paramètre, MTableau_de_nom_paramètre, MTableau_de_option , MTableau_de_nom_option ...
Idem pour I_Composant qui accueillera CProduit_configuré, MParamètre, MOption ...
Vous l'aurez compris les classes concrètes implément I_Composite ou I_Composant.
J'ai mis en place un test avec une série de trace pour expliquer, j'espère que cela sera plus clair :

Je crée mon Produit configuré dont l'ID est 1 (je ne vais pas m'attarder sur ce point :
i_monModèle est un I_Modèle <- allouer un (g_e_MonModèle.Valeur) i_Composant_Produit_configuré est un I_Composant <- i_monModèle:Charger(1,su_monModèleParent)
A ce stade j'ai un produit configuré (un composant) qui contient plusieur membres de type simple, Composant et Composite, ci-dessous la déclaration :
CProduit_configuré est une Classe implémente I_Produit implémente I_Produit_simple implémente I_Produit_Configuré implémente I_Composant implémente I_Composant_produit hérite de MProduit
PROTÉGÉ m_i_Tableau_de_paramètre est un I_Composite <note="Instance tableau de modèle:MParamètre"> PRIVÉE m_su_Code_vide est une chaîne UNICODE <note="Ignorer">= "Ø" m_su_Séparateur_option est une chaîne UNICODE <note="Ignorer">= "-"
FIN Déclaration du la classe modèle MTableau_de_paramètre :
MTableau_de_paramètre est une Classe implémente I_Composite hérite de CComposite PRIVÉ m_tab_i_Paramètre est un tableau de I_Composant <note="Tableau de modèle:MParamètre"> FIN Dans notre cas la porté publique, protégé ou privé ne change rien car nous passons par les interfaces qui utilisent les propriété générées depuis les membres des classes.
Explication du test :
je récupère le membre le membre composite par une méthode qui se trouve dans la classe concrète (CComposite ) commune à tous les composites :
i_Composite_paramètre est un I_Composit <- i_Composant_Produit_configuré:get_Composite("Paramètre")
"Paramètre" étant une chaine de caractère portant le nom des instances contenues dans le Composite (même que le fichier de données). Si je veux un autre membre composite, je change la chaine en conséquence.
Je teste que le tableau n'est pas vide, j'ai bien 17 Instance d'interface I_Composant portant des instances de MParamètre
Je sais que le Composant qui a "M" pour valeur du membre m_c_Lettre_paramètre est le N°13 dans le tableau, je récupère ce dernier Je met sa valeur dans une variable chaine, on a bien "M" c'est donc que que ce dernier existe et accessible.
Je fait la recherche avec la fonction WL Cherche() et là elle ne trouve rien et me retourne -1
Je me demande donc s'il est simplement possible de faire une recherche sur un tableau d'interface, car il y à quelque temps j'ai tenté de faire une file d'interface (Enfile/Défile) est il semble que cela ne soit pas possible avec une erreur très explicite ou je ne sais pas comment faire, car je ne vois pas ou mettre l'opérateur d'affectation <-

Plus j'avance avec les Interface en WL et plus je tombe sur des limitations ...
Cordialement.
Aziz |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 318 messages |
|
| Posté le 08 août 2025 - 14:40 |
J'utilise donc une instance d'interface (i_Composite_paramètre dans l'exemple qui va suivre) dans laquelle je pourrai avoir, MTableau_de_paramètre, MTableau_de_nom_paramètre, MTableau_de_option , MTableau_de_nom_option ...
Je me demande donc s'il est simplement possible de faire une recherche sur un tableau d'interface
Dans la mesure où une interface est une liste de fonction, de procédures, de getters/setters (propriétés) elle ne comporte aucun membres, elle ne peut donc pas être instanciée, et, à fortiori, on ne peut pas faire de recherche sur une interface.
-- Il y a peut être plus simple, mais, ça tourne Quand tout a échoué, utilise l'option RTFM |
| |
| |
| | | |
|
| | | | |
| | |
|