dim. 18 janvier 2015, 10h49
Jean à Grenoble
atoutfox.public.association
This.parent dans une classe fille dont le pointeur est dans une collection
Bonjour à tous,
dans une classe, je voudrais un pointeur sur une classe_fille (les parents) et
une collection de pointeurs sur une autre classe fille (leurs enfants). Dans les
classes filles, je voudrais pouvoir accéder aux propriétés et méthodes de la
classe supérieure avec this.parent (ou This.parent.parent dans le cas de la
collection).
On a 2 moyens pour définir un pointeur sur une classe fille :
- créer une propriété 'ptr' et écrire This.ptr = AddObject() mais dans ce cas,
this.parent est inconnu dans la classe fille
- écrire This.addobject("ptr", "maclassefille", ...) et dans ce cas
This.parent est bien connu dans la classe fille.
Ce que je n'arrive pas à faire, c'est créer les classes filles à l'intérieur de
la collection. J'étai parti sur :
FOR lnindice = 1 TO 5
This.newobject("ptr", "classe_fille", "test_newobject.prg", "", m.lnindice)
This.colldyn_fille.add(This.ptr)
This.RemoveObject("ptr")
NEXT
mais lors du removeobject, l'élément de la collection est supprimé (à la fin de
la boucle This.colldyn_fille.count = 0)
J'ai essayé sans succès :
FOR lnindice = 1 TO 5
This.newobject("ptr", "classe_fille", "test_newobject.prg", "", m.lnindice)
lnptr = This.ptr
This.colldyn_fille.add(m.lnptr)
This.RemoveObject("ptr")
NEXT
J'ai aussi essayé :
FOR lnindice = 1 TO 5
This.colldyn_fille.add(This.newobject("ptr", "classe_fille", ;
"test_newobject.prg", "", m.lnindice))
NEXT
mais à la deuxième boucle, il me dit que ptr existe déjà.
Le contournement du problème est de passer 'this' en paramètre lors de la
création de la classe fille. Mais si on pouvait faire cela plus OOP ....
Bonne journée à tous
Jean à Grenoble
Ci dessous, l'ensemble du programme qui me sert pour tester cela :
loobj = CREATEOBJECT("classe_parent")
loobj.test()
loobj = NULL
DEFINE CLASS classe_fille AS custom && jme 18/01/2015
nom = "classe_fille"
indice = 0
PROCEDURE Init(pnindice AS Number)
IF PCOUNT()>0
This.indice = m.pnindice
ELSE && PCOUNT()>0
This.indice = -1
ENDIF && PCOUNT()>0
ENDPROC && Init
PROCEDURE Destroy
ENDPROC && Destroy
PROCEDURE test_parent(pnindice AS Number)
IF m.pnindice = 0
? STR(This.indice,4)+ " "+ This.parent.nom
ELSE && m.pnindice = 0
? STR(This.indice,4)+ " "+ This.parent.parent.nom
ENDIF && m.pnindice = 0
RETURN
ENDPROC && test_parent
ENDDEFINE && classe_fille
DEFINE CLASS classe_parent AS custom && jme 18/01/2015
nom = "classe_parent"
*!* ptr_fille = NULL
*!* coll_fille = NULL
PROCEDURE Init
*!* This.ptr_fille = NEWOBJECT("classe_fille", "test_newobject.prg")
*!* This.coll_fille = CREATEOBJECT("collection")
*!* FOR lnindice = 1 TO 5
*!* This.coll_fille.add(NEWOBJECT("classe_fille", "test_newobject.prg", "",
m.lnindice))
*!* NEXT && lnindice = 1 TO 5
ENDPROC && Init
PROCEDURE Destroy
ENDPROC && Destroy
PROCEDURE test
CLEAR
*!* ? "test 1 "
*!* This.ptr_fille.test_parent(0) && erreur .parent n'existe pas
*!* FOR lnindice = 1 TO 5
*!* This.coll_fille.item(m.lnindice).test_parent(m.lnindice) && erreur
*!* NEXT && lnindice = 1 TO 5
This.newobject("ptrdyn_fille", "classe_fille", "test_newobject.prg")
This.ptrdyn_fille.test_parent(0)
This.addobject("colldyn_fille", "collection")
*SET STEP ON
FOR lnindice = 1 TO 5
*!* This.newobject("ptr", "classe_fille", "test_newobject.prg", "", m.lnindice)
*!* This.colldyn_fille.add(This.ptr)
*!* This.RemoveObject("ptr")
*!* This.newobject("ptr", "classe_fille", "test_newobject.prg", "", m.lnindice)
*!* lnptr = This.ptr
*!* This.colldyn_fille.add(m.lnptr)
*!* This.RemoveObject("ptr")
This.colldyn_fille.add(This.newobject("ptr", "classe_fille",
"test_newobject.prg", "", m.lnindice))
NEXT && lnindice = 1 TO 5
? "test 2 "
This.ptrdyn_fille.test_parent(0)
FOR lnindice = 1 TO 5
This.colldyn_fille.item(m.lnindice).test_parent(m.lnindice)
NEXT && lnindice = 1 TO 5
RETURN
ENDPROC && test
ENDDEFINE && classe_parent
Permalink : http://www.atoutfox.org/nntp.asp?ID=0000015765