| |
Membre enregistré 16 messages |
|
| Posté le 02 octobre 2019 - 15:22 |
Hello, je cherche le nom de la classe qui appelle une procédure *globale* héritée. Exemple :
UnParent est une classe Procedure globale publique NomDeClasse() Trace( [Nom de la classe qui appelle] )
UnEnfant est une classe hérite de UnParent
UnEnfant.NomDeClasse()
Je pourrais passer par une propriété de l'objet UnEnfant pour y ranger mon nom de classe, mais c'est pas propre et ça oblige à allouer UnEnfant juste pour pouvoir utiliser une procédure globale.
J'ai essayé de créer un membre global chaîne de UnEnfant où stocker le nom de la classe, mais je n'ai pas réussi à le lire depuis DisTonNom() par indirection {"gm_sNomClasse"} et je ne sais pas trop comment y accéder autrement.
Un des objectifs pratiques est d'avoir une procédure qui puisse me préparer une liste tous les éléments d'une classe (remplie par fichier de données), ex :
UnParent est une classe Procedure globale publique ListeTous() taObjets est un tableau d'objets pour TOUT {NomDuFichier,indFichier} nID = {NomDuFichier+".ID"+NomDuFichier} taObjets[nID] = allouer NomDeLaClasse(nID) FIN RENVOYER taObjets
Quelqu'un a une idée ?Message modifié, 02 octobre 2019 - 15:25 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 69 messages |
|
| Posté le 02 octobre 2019 - 17:31 |
Bonjour Simon,
Je te propose ça.
Def est une Définition // Déclaration d'une variable de type Définition
Def = RécupèreDéfinition(objet) // Récupération de la définition de l'objet
Trace(Def..Nom) // Affichage du nom de l'objet
Bon développement |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 512 messages |
|
| Posté le 02 octobre 2019 - 18:12 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages |
|
| Posté le 03 octobre 2019 - 20:01 |
Bonsoir et merci à tous les deux pour vos réponses, cependant à moins que j'aie mal compris il y a un souci :
Je parle ici d'une Méthode GLOBALE dans la classe parent. Or, dans ce cas-là, il n'existe pas de "objet" duquel récupérer un ..Classe ou une Définition ...Message modifié, 03 octobre 2019 - 20:04 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 512 messages |
|
| Posté le 04 octobre 2019 - 08:41 |
Bonjour Simon,
sNomClasse est une chaîne = UnEnfant Trace(sNomClasse)
clDyn est un objet dynamique = allouer sNomClasse
Mais je pense que l'instruction Allouer connaît des limitations, en particulier le constructeur de classe doit être valide pour une instanciation sans passage de paramètre.

-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/… |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 512 messages |
|
| Posté le 04 octobre 2019 - 09:39 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 361 messages |
|
| Posté le 04 octobre 2019 - 09:44 |
Bonjour, =JBO= a écrit :
On se demande comment Yann à eu connaissance de ces syntaxes qui ne sont pas présentées dans la documentation en ligne !?
Ici : https://doc.pcsoft.fr/?1000019560 peut être, ou là https://doc.pcsoft.fr/?6010015
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 04 octobre 2019 - 09:46 |
| |
| |
| | | |
|
| | |
| |
| Posté le 04 octobre 2019 - 09:51 |
Bonjour, je doute qu'il soit possible de récupérer le nom de la classe sur une méthode globale. Si je fais un trace(dbgInfo(dbgElément)) c'est toujours la classe parent qui ressort. Cordialement. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 69 messages |
|
| Posté le 04 octobre 2019 - 10:48 |
Bonjour JBO,
Mon prénom n'est pas Yann, mais ce n'est pas le sujet 
Comme le précise Voroltinquo, j'ai juste regardé la doc, mais ta solution ..Classe me parait plus appropriée pour une programmation POO. pour l'info.
Bonne journée à tous |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 512 messages |
|
| Posté le 04 octobre 2019 - 11:29 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 512 messages |
|
| Posté le 04 octobre 2019 - 12:02 |
Simon,
1ère proposition :
Dans ton ébauche de code :
UnParent est une classe
Procedure globale publique ListeTous() taObjets est un tableau d'objets POUR TOUT {NomDuFichier,indFichier} nID = {NomDuFichier+".ID"+NomDuFichier} taObjets[nID] = allouer NomDeLaClasse(nID) FIN RENVOYER taObjets tu utilises un symbole 'NomDuFichier', ce qui laisse penser que c'est peut être un membre global et quelque part tu renseignes ce membre. Logiquement, tu pourrais au même endroit indiquer le nom de la classe à utiliser pour l'instanciation (ou bien indiquer la définition).
2ème proposition, plus lourde :
• rendre virtuelle la méthode globale ListeTous() et dans son code utiliser dbgInfo(dbgElément,dbgTraitementAppelant) pour retrouver le nom de la classe de définition, comme suggéré par Sylvain. ExtraitChaîne(dbgInfo(dbgElément,dbgTraitementAppelant),2,".",DepuisFin))
• redéfinir la méthode globale dans toutes les classes enfants ; dans le code de la procédure redéfinie, appeler directement la méthode globale de la classe de base. RENVOYER UnParent::ListeTous()
Remarque: j'ai essayé la syntaxe 'Ancêtre' mais dans ma version de WINDEV elle provoque une erreur fatale, probablement parce qu'elle est prévue pour fonctionner à partir d'un une instance de classe.Message modifié, 04 octobre 2019 - 12:29 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages |
|
| Posté le 29 octobre 2019 - 15:18 |
Bonjour,
Désolé pour la réponse tardive (c'est un compte partagé dans la boîte et je ne reçois pas les notifications).
Merci pour vos réponses. Finalement on utilise beaucoup d'indirections en (re)définissant à chaque fois les les membres globaux nécessaires dans les classes héritantes. C'est un peu lourd mais bon, ça marche. |
| |
| |
| | | |
|
| | |
| |
| Posté le 27 avril 2023 - 12:50 |
| Moi, également j'ai testé dbgInfo(dbgElement) .
Ce code ne retourne que le nom de la classe Mére.
Or le souçi c'est de récupérer le nom de la classe Fille |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 361 messages |
|
| Posté le 27 avril 2023 - 16:09 |
Bonjour, dimonekene a écrit :
Or le souçi c'est de récupérer le nom de la classe Fille
Je dirai laquelle.
Prenons l'exemple suivant
CMère est classe PROTÉGÉ FIN
CFille est classe hérite de CMère PRIVÉ FIN
CSoeur est Classe hérite de CMère PRIVÉ FIN Tu veux récupérer CFille ou CSoeur ? D'autant plus que pour une même instance de CMère on peut avoir un CFille et une CSoeur
e.g. Un client qui hérite de Personne, et un employé qui hérite de Personne. L'employé peut être client. Donc la personne est elle un employé ou un client. Dans le cas d'un héritage, on ne manipule plus la personne, mais l'employé ou le client.
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 27 avril 2023 - 16:23 |
| |
| |
| | | |
|
| | |