Macro de simplification POO
Publié : mer. 18/juil./2007 10:21
La macro que je vous propose permet de rajouter les opérateurs New et Delete.
Un test:
Code : Tout sélectionner
; Fichier New_Delete.pb
Macro New(Pointer,Class)
Pointer#_.Class#_=AllocateMemory(SizeOf(Class#_))
Pointer#_\Vtable=?Class
Pointer#.Class=@Pointer#_\Vtable
Class(Pointer)
EndMacro
Macro Delete(Pointer,Class)
Pointer#_.Class#_=Pointer
Class#_(Pointer)
FreeMemory(Pointer)
EndMacro
Un test:
Code : Tout sélectionner
; Important:pour que la macro fonctionne, il est impératif
; - Que le nom de la structure soit le même que le nom de l'interface suivit du caractère "_"
; - Que la structure possède la variable Vtable (Première position dans la structure important)
; - Que les procédures Constructeur et Destructeur possèdent le même nom que celui de l'interface
; - Que le nom de chargement des données dans la DataSection soit le même que celui de l'interface
; Pour Rappel: *This = Adresse de la variable Vtable
; Il est important que cette variable Vtable soit déclaré en premier
; dans la Structure pour que: *This.Calcul_=*This.Calcul
; SiVtable était déclaré en deuxième position, on aurait:*This.Calcul_=*This.Calcul-8
; Cela nous permet donc de remplacer dans les procédures *This.Calcul par *This.Calcul_
; On choisit ainsi de travailler sur les fonctions ou sur les membres en prenant l'un ou l'autre
; Fonctions de la Classe
Interface Calcul
SetData(a.l,b.l)
Addition()
Multiplication()
EndInterface
; Membre de la classe
Structure Calcul_
Vtable.l ; Important première position
a.l
b.l
EndStructure
; Constructeur de la Classe
; Appelé aprés création des ressources
Procedure Calcul(*This.Calcul_)
Debug "--------------------------"
Debug "Constructor"
*This\a=0
*This\b=0
Debug "--------------------------"
EndProcedure
; Destructeur de la Classe
; Appelé avant libération des ressources
Procedure Calcul_(*This.Calcul_)
Debug "--------------------------"
Debug "Destructor"
Debug "--------------------------"
EndProcedure
IncludeFile "New_Delete.pb"
Procedure.l Setdata(*This.Calcul_,a.l,b.l)
*This\a=a
*This\b=b
EndProcedure
Procedure.l Addition(*This.Calcul_)
ProcedureReturn *This\a + *This\b
EndProcedure
Procedure.l Multiplication(*This.Calcul_)
ProcedureReturn *This\a * *This\b
EndProcedure
New(*Pointeur,Calcul)
*Pointeur\Setdata(5,3)
Debug "Addition= "+Str(*Pointeur\ Addition())
Debug "Multiplication= "+Str(*Pointeur\ Multiplication())
Delete(*Pointeur,Calcul)
DataSection
Calcul:
Data.l @SetData(),@Addition(),@Multiplication()
EndDataSection