Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD7.5] un gros doute sur la POO

8 réponses
Avatar
Roumegou
Bonjour,

soit plusieurs classes dérivées d'une seule et meme classe.

c_mysql4wd est un objet c_log4wd
c_oracle4wd est un objet c_log4wd
c_sqlite4wd est un objet c_log4wd
c_Natif4wd est un objet c_log4wd

vous les connaissez tous ;-)

J'ai une méthode qui n'existe que dans cOracle4wd mySQLSetMode mais
comme je passe par un objet dynamique qui est attribué par
programmation selon le type de connexion SGBD; j'ai besoin que cette
méthode soit reconnue par toutes les classes (mais si elle ne fait
rien).

Donc j'ai créé une méthode mySQLSetMode dans la classe pere c_log4wd
(qui ne fait rien) et la méthode mySQLSetMode est redéfinie pour
c_Oracle4wd.

Dans le cas de c_oracle4wd, c'est la méthode redéfinie qui est active;
dans les autres cas c'est celle de c_log4wd.

Enfin, c'est ce que je croyais jusqu'à ce que je vois un warning dans
Webdev qui me dit
<la méthode mysqlsetmode de la classe c_oracle4wd est virtuelle car une
méthode mysqlsetMode existe déja une classe de base de la classe>

Qu'en est-il vraiment ?

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)

8 réponses

Avatar
Matthieu Sadouni
Roumegou wrote:
(cut)
Dans le cas de c_oracle4wd, c'est la méthode redéfinie qui est active;
dans les autres cas c'est celle de c_log4wd.

Enfin, c'est ce que je croyais jusqu'à ce que je vois un warning dans
Webdev qui me dit
<la méthode mysqlsetmode de la classe c_oracle4wd est virtuelle car une
méthode mysqlsetMode existe déja une classe de base de la classe>

Qu'en est-il vraiment ?



j'ai un peu le même principe pour une gestion de tree views et le
polymorphisme fonctionne bien, sous windev par contre.. Peut être est ce
un problème avec Webdev ? Au vu du warning, ça ne lui plaît pas que
mysqlSetMode dans la classe oracle soit virtuelle, or c'est normal
qu'elle le soit .. Est ce qu il appelle bien la bonne malgré le warning
ou est ce que ça ne foncionne pas ?

--
Matthieu Sadouni
Avatar
Roumegou
Ouaih et bien cela ne doit pas marcher comme je le pensais.

Car en fait, si on laisse l'objet en dynamique
fSQL est un objet dynamique

puis en prog on a fSQL=allouer c_mySQL4WD

Il n'y a pas d'erreur à l'execution.

mais il gueule sur la méthode mysqlsetmode, avec des erreurs graves si
l'on déclare tout de suite fSQL est un objet c_mysql4wd.
Meme si la méthode est déclarée public dans c_log4wd.


Roumegou a présenté l'énoncé suivant :
Bonjour,

soit plusieurs classes dérivées d'une seule et meme classe.

c_mysql4wd est un objet c_log4wd
c_oracle4wd est un objet c_log4wd
c_sqlite4wd est un objet c_log4wd
c_Natif4wd est un objet c_log4wd

vous les connaissez tous ;-)

J'ai une méthode qui n'existe que dans cOracle4wd mySQLSetMode mais comme je
passe par un objet dynamique qui est attribué par programmation selon le type
de connexion SGBD; j'ai besoin que cette méthode soit reconnue par toutes les
classes (mais si elle ne fait rien).

Donc j'ai créé une méthode mySQLSetMode dans la classe pere c_log4wd (qui ne
fait rien) et la méthode mySQLSetMode est redéfinie pour c_Oracle4wd.

Dans le cas de c_oracle4wd, c'est la méthode redéfinie qui est active; dans
les autres cas c'est celle de c_log4wd.

Enfin, c'est ce que je croyais jusqu'à ce que je vois un warning dans Webdev
qui me dit
<la méthode mysqlsetmode de la classe c_oracle4wd est virtuelle car une
méthode mysqlsetMode existe déja une classe de base de la classe>

Qu'en est-il vraiment ?



--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Matthieu Sadouni a formulé la demande :
Roumegou wrote:
(cut)
Dans le cas de c_oracle4wd, c'est la méthode redéfinie qui est active; dans
les autres cas c'est celle de c_log4wd.

Enfin, c'est ce que je croyais jusqu'à ce que je vois un warning dans
Webdev qui me dit
<la méthode mysqlsetmode de la classe c_oracle4wd est virtuelle car une
méthode mysqlsetMode existe déja une classe de base de la classe>

Qu'en est-il vraiment ?



j'ai un peu le même principe pour une gestion de tree views et le
polymorphisme fonctionne bien, sous windev par contre.. Peut être est ce un
problème avec Webdev ? Au vu du warning, ça ne lui plaît pas que mysqlSetMode
dans la classe oracle soit virtuelle, or c'est normal qu'elle le soit .. Est
ce qu il appelle bien la bonne malgré le warning ou est ce que ça ne
fonctionne pas ?



Voilà le mot savant qu'il me manquait; like mr jourdain avec sa prose,
je voulais faire du polymorphisme sans le savoir ;-))

Je n'ai pas encore testé le fonctionnement avec Webdev, car il faut que
j'adapte (réadapte) les classes pour Webdev car la compatibilité de
webdev/windev n'est pas toujours intelligente (il pourrait ignorer
certaine instructions ou objet pour compatibilité).
Mais , cf mon msg précédent, meme dans windev7.5 ce n'est pas très
apprécié par le compilateur comme technique meme si cela fonctionne.

je récapitule ce que je fais:
Dans ouv du projet
fSQL est un objet dynamique

Dans fen connexion
Selon SGBD
cas 1
fSQL=allouer c_Oracle4wd
cas 2
fSQL=allouer c_Oracle4wd

dans classe c_log4wd
PROCEDURE PUBLIC mySQLSetMode(Mode)

// pour compatibilité Oracl4wd

dans classe c_oracle4wd
PROCEDURE mySQLSetMode(Mode)
LOCAL
myNumMode is unsigned int
myNumMode = Mode
AppelDLL32(:DLLName, "WSQL_SetMode", myNumMode)


PS : ce qui est très ch.. quand on utilise un objet dynamique, c'estque
l'on a pas la complétion. Je le redéfinis toujours sur une classe
donnée pendant le dev, et le remet en dynamique pour tester. Si vous
avez une meilleure façon ?

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Matthieu Sadouni
Roumegou wrote:


Voilà le mot savant qu'il me manquait; like mr jourdain avec sa prose,
je voulais faire du polymorphisme sans le savoir ;-))

Je n'ai pas encore testé le fonctionnement avec Webdev, car il faut que
j'adapte (réadapte) les classes pour Webdev car la compatibilité de
webdev/windev n'est pas toujours intelligente (il pourrait ignorer
certaine instructions ou objet pour compatibilité).
Mais , cf mon msg précédent, meme dans windev7.5 ce n'est pas très
apprécié par le compilateur comme technique meme si cela fonctionne.

je récapitule ce que je fais:
Dans ouv du projet
fSQL est un objet dynamique




essaie :
fSQL est un c_log4wd dynamique

il faut lui dire quel type d'objet c'est a l'origine pour que lors de
l'appel a mySQLSetMode il repointe sur le bon type
c'est à cause de ça que ça plante chez toi je pense

dans classe c_log4wd
PROCEDURE PUBLIC mySQLSetMode(Mode)




définis la en virtuelle, normalement il le fait automatiquement quand tu
crées la methode dans une classe héritante mais c'est juste pour être sûr :)

// pour compatibilité Oracl4wd

dans classe c_oracle4wd
PROCEDURE mySQLSetMode(Mode)
LOCAL
myNumMode is unsigned int
myNumMode = Mode
AppelDLL32(:DLLName, "WSQL_SetMode", myNumMode)




celle la doit être virtuelle aussi, il a également dû le faire
automatiquement mais vérifie au cas où


PS : ce qui est très ch.. quand on utilise un objet dynamique, c'estque
l'on a pas la complétion. Je le redéfinis toujours sur une classe donnée
pendant le dev, et le remet en dynamique pour tester. Si vous avez une
meilleure façon ?




oui ca c'est lourd il me semble que ça existe en 8 ? mais en 7.5 j'ai le
même problème

--
Matthieu Sadouni
Avatar
Roumegou
Matthieu Sadouni avait soumis l'idée :
Roumegou wrote:

je récapitule ce que je fais:
Dans ouv du projet
fSQL est un objet dynamique




essaie :
fSQL est un c_log4wd dynamique



Oui mais là 5000 erreurs dans mon projet car toutes les méthodes non
définies dans c_log4wd causent des erreurs.



il faut lui dire quel type d'objet c'est a l'origine pour que lors de l'appel
a mySQLSetMode il repointe sur le bon type
c'est à cause de ça que ça plante chez toi je pense

dans classe c_log4wd
PROCEDURE PUBLIC mySQLSetMode(Mode)




définis la en virtuelle, normalement il le fait automatiquement quand tu
crées la methode dans une classe héritante mais c'est juste pour être sûr :)

// pour compatibilité Oracl4wd

dans classe c_oracle4wd
PROCEDURE mySQLSetMode(Mode)
LOCAL
myNumMode is unsigned int
myNumMode = Mode
AppelDLL32(:DLLName, "WSQL_SetMode", myNumMode)




celle la doit être virtuelle aussi, il a également dû le faire
automatiquement mais vérifie au cas où



Non ce n'est pas automatique
Là je n'ai plus que le warning.
Mais dés que je remet mon objet sur une classe donnée (pour avoir la
complétion) j'ai des messages
L'accès à la méthode mysqlsetmode de la classe c_log4wd est restreint
par un héritage privé.

Bon, je vais recopier la méthode dans toutes mes classes mais je ne
trouve pas cela très propre.


PS : ce qui est très ch.. quand on utilise un objet dynamique, c'estque
l'on a pas la complétion. Je le redéfinis toujours sur une classe donnée
pendant le dev, et le remet en dynamique pour tester. Si vous avez une
meilleure façon ?




oui ca c'est lourd il me semble que ça existe en 8 ? mais en 7.5 j'ai le même
problème



Ah ? bonne nouvelle meme si je ne vois pas comment il peut faire ?

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Matthieu Sadouni
Roumegou wrote:

Matthieu Sadouni avait soumis l'idée :

Roumegou wrote:

je récapitule ce que je fais:
Dans ouv du projet
fSQL est un objet dynamique




essaie :
fSQL est un c_log4wd dynamique




Oui mais là 5000 erreurs dans mon projet car toutes les méthodes non
définies dans c_log4wd causent des erreurs.




même si tu fais :

fSQL est un c_log4wd dynamique

Dans fen connexion
Selon SGBD
cas 1
fSQL=allouer c_Oracle4wd
cas 2
fSQL=allouer c_Oracle4wd

?
ton fSQL sera à la fois un c_log4wd et un c_oracle4wd donc il ne devrait
pas y avoir d'erreur, il aura accès aux méthodes des 2, et les appels
aux méthodes de c_log4wd qui sont redéfinies pointeront sur les méthodes
de c_oracle4wd

ou alors j'ai zappé un truc mais mes objets treeview fonctionnent comme
ça et je n'ai pas de pb qd j'utilise des méthodes présentes uniquement
dans les classes dérivées

--
Matthieu Sadouni
Avatar
Roumegou
Matthieu Sadouni a exprimé avec précision :
Roumegou wrote:

Matthieu Sadouni avait soumis l'idée :

Roumegou wrote:

je récapitule ce que je fais:
Dans ouv du projet
fSQL est un objet dynamique




essaie :
fSQL est un c_log4wd dynamique




Oui mais là 5000 erreurs dans mon projet car toutes les méthodes non
définies dans c_log4wd causent des erreurs.




même si tu fais :

fSQL est un c_log4wd dynamique

Dans fen connexion
Selon SGBD
cas 1
fSQL=allouer c_Oracle4wd
cas 2
fSQL=allouer c_mysql4wd

?
ton fSQL sera à la fois un c_log4wd et un c_oracle4wd donc il ne devrait pas
y avoir d'erreur, il aura accès aux méthodes des 2, et les appels aux
méthodes de c_log4wd qui sont redéfinies pointeront sur les méthodes de
c_oracle4wd



C'est dans l'éditeur de code que j'ai un pb. A l'execution, je pense
que cela passerait. En fait l'éditeur de code ne semble reconnaitre que
la première allocation et ne pas interprêter les "fSQL=allouer
c_mysql4wd"

J'ai essayé aussi
fsql est un objet mysql4wd dynamique
là plus d'erreurs de compil, mais à l'execution il refuse d'allouer un
objet oracle4wd à un objet mysql4wd; meme si les méthodes sont les
mèmes.



ou alors j'ai zappé un truc mais mes objets treeview fonctionnent comme ça et
je n'ai pas de pb qd j'utilise des méthodes présentes uniquement dans les
classes dérivées



--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Matthieu Sadouni
Roumegou wrote:

Matthieu Sadouni a exprimé avec précision :

Roumegou wrote:

Matthieu Sadouni avait soumis l'idée :

Roumegou wrote:

je récapitule ce que je fais:
Dans ouv du projet
fSQL est un objet dynamique




essaie :
fSQL est un c_log4wd dynamique





Oui mais là 5000 erreurs dans mon projet car toutes les méthodes non
définies dans c_log4wd causent des erreurs.




même si tu fais :

fSQL est un c_log4wd dynamique

Dans fen connexion
Selon SGBD
cas 1
fSQL=allouer c_Oracle4wd
cas 2
fSQL=allouer c_mysql4wd

?
ton fSQL sera à la fois un c_log4wd et un c_oracle4wd donc il ne
devrait pas y avoir d'erreur, il aura accès aux méthodes des 2, et les
appels aux méthodes de c_log4wd qui sont redéfinies pointeront sur les
méthodes de c_oracle4wd




C'est dans l'éditeur de code que j'ai un pb. A l'execution, je pense que
cela passerait. En fait l'éditeur de code ne semble reconnaitre que la
première allocation et ne pas interprêter les "fSQL=allouer c_mysql4wd"




oui à l'exécution c'est bon mais tu n'auras pas la complétion de
l'éditeur.. s'il te met toujours un warning ça n'est pas normal par
contre, peut être un pb de compatibilité sur l'objet entre windev et
webdev ?

J'ai essayé aussi
fsql est un objet mysql4wd dynamique
là plus d'erreurs de compil, mais à l'execution il refuse d'allouer un
objet oracle4wd à un objet mysql4wd; meme si les méthodes sont les mèmes.




ça c'est normal, ce ne sont pas les mêmes objets :)

--
Matthieu Sadouni