Essai sur la POO
Publié : sam. 08/août/2009 15:56
J'attaque un nouveau projet et entendant beaucoup parlé de la poo j'ai décidé de m'y mettre. Je ne sais pas si le code est vraiment dans l'esprit et j'attends vos commentaires et amélioration.
Je mets ça ici car j'ai passé une semaine à me faire c.... pour arriver à ce que je voulais donc si cela peut en aider pourquoi pas.
Je dois déclarer les procedure associé pour chaque objet (add_methode) si quelqu'un à une idée pour ne déclarer les procedures qu'une fois et que cela s'applique directement au nouveau objet je suis preneur.
Je mets ça ici car j'ai passé une semaine à me faire c.... pour arriver à ce que je voulais donc si cela peut en aider pourquoi pas.
Je dois déclarer les procedure associé pour chaque objet (add_methode) si quelqu'un à une idée pour ne déclarer les procedures qu'une fois et que cela s'applique directement au nouveau objet je suis preneur.
Code : Tout sélectionner
;{
Macro class(classname)
Interface classname#_IN
EndMacro
Macro methode(classname)
EndInterface
Structure classname#_MT
EndMacro
Macro membre(classname)
EndStructure
Structure classname#_MB
*MT.classname#_MT
EndMacro
Macro endclass(classname)
EndStructure
Structure classname
MT.classname#_MT
mb.classname#_MB
action.classname#_IN
EndStructure
EndMacro
;----- CLASS HERITAGE
Macro class_h(classname,classmere)
Interface classname#_IN Extends classmere#_IN
EndMacro
Macro methode_h(classname,classmere)
EndInterface
Structure classname#_MT Extends classmere#_MT
EndMacro
Macro membre_h(classname,classmere)
EndStructure
Structure classname#_MB Extends classmere#_MB
EndMacro
;----- CREATION D'UN OBJET OU LISTE
Macro new_listclass(classname,liste)
Global NewList liste.classname#()
EndMacro
Macro new_objetclass(classname,objet)
*objet.classname = AllocateMemory(SizeOf(classname))
EndMacro
;----- AJOUT ITEM A UNE LISTE
Macro add_item_listclass(liste)
AddElement(liste#())
liste#()\mb\MT = liste#()\MT
liste#()\action = @liste()\mb
EndMacro
;----- AJOUT UNE METHODE A UNE LISTE
Macro add_methode_listclass(liste,methode,proc)
liste#()\MT\methode = @proc#()
EndMacro
;----- AJOUTE UN OBJET
Macro add_item_objetclass(variable)
*variable\mb\MT = *variable\MT
*variable\action = @*variable\mb
EndMacro
;----- AJOUTE UNE METHODE A UN OBJET
Macro add_methode_objetclass(variable,methode,proc)
*variable\MT\methode = @proc()
EndMacro
;----- FONCTION POUR LA CREATION DE PROCEDURE
Macro mb(membre)
*this\membre
EndMacro
Macro Pointerclass(classname)
*this.classname#_MB
EndMacro
;----- FIN MACRO
;}
;exemple d'utilisation
;DEFINITION DES CLASSES
class(inventaire)
slot(slot.b,nomobjet.s)
methode(inventaire)
*slot
membre(inventaire)
sac.s[16]
endclass(inventaire)
class_h(perso,inventaire)
position(x,y)
methode_h(perso,inventaire)
*position
membre_h(perso,inventaire)
x.l
y.l
vie.l
endclass(perso)
;DEFINITION DES PROCEDURES DE CLASSES
Procedure.s slot(Pointerclass(inventaire),slot,nomobjet.s)
;*this\sac[slot] = nomobjet
mb(sac[slot]) = nomobjet
ProcedureReturn nomobjet
EndProcedure
Procedure position(Pointerclass(perso),x.l,y.l)
mb(x) = x ;UTILISATION AVEC LA MACRO
*this\y = y ;== mb(y) = y UTILISATION DIRECTE SANS LA MACRO
EndProcedure
new_listclass(perso,perso) ;ON CREER UNE LISTE CONTENANT NOS PERSONNAGES
;ON AJOUTE UN PERSONNAGE ET LES METHODES ASSOCIEES
add_item_listclass(perso)
add_methode_listclass(perso,slot,slot)
add_methode_listclass(perso,position,position)
;JUSTE POUR EXEMPLE UNE PROCEDURE STANDARD
Procedure position_(x,y) ;une strucutre standard identique à celle de dessus
perso()\mb\x = x
perso()\mb\y = y
EndProcedure
;maintenant on peut appeler les procedures directement ainsi que les champs(membre)
perso()\action\position(50,12) ;on utilise la structure classe
Debug Str(perso()\mb\x)+" : "+Str(perso()\mb\y)
position_(78,98) ; on utilise la structure standard
Debug Str(perso()\mb\x)+" : "+Str(perso()\mb\y)
perso()\action\slot(1,"plume")
retour = perso()\action\slot(2,"encre")
;retour$ = PeekS(perso()\action\slot(2,"encre")) ; les retour de string sont des adresses
Debug PeekS(retour)
;CREATION D'UN DEUXIEME PERSONNAGE
add_item_listclass(perso)
add_methode_listclass(perso,slot,slot)
add_methode_listclass(perso,position,position)
perso()\action\position(23,45) ;ON DEFINI SA POSITION
perso()\action\slot(1,"parchemin") ;ON RENTRE UN OBJET DANS LE SLOT 1
;on récapitule
Debug "RECAPITULATIF DES PERSOS"
num = 1
ForEach perso()
Debug "perso "+Str(num)+" en position X "+ Str(perso()\mb\x) + " Y "+Str(perso()\mb\y)
Debug "inventaire :"
For i=1 To 2
If perso()\mb\sac[i]<>""
Debug " - "+perso()\mb\sac[i]
EndIf
Next i
num+1
Next