; 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
;-----------------------Fichier New_Delete.pb --------------------
Macro Class(Debut)
Interface Debut
EndMacro
Macro Membre(Fin)
EndInterface
Structure Fin#_
Vtable.l
EndMacro
Macro EndClass()
EndStructure
EndMacro
Macro New(Pointer, Class)
Pointer#_.Class#_= AllocateMemory(SizeOf(Class#_))
Pointer#_\Vtable =?Class
Pointer#.Class =@Pointer#_\Vtable
Class(Pointer)
EndMacro
Macro Delete(Pointer, Class)
If Pointer
Pointer#_.Class#_= Pointer
Class#_Pointer)
FreeMemory(Pointer)
EndIf
EndMacro
Macro Method(Class, Function)
Procedure.l Function#*This.Class#_
EndMacro
Macro Constructor(Class)
Procedure.l Class#*This.Class#_)
EndMacro
Macro Destructor(Class)
Procedure.l Class#_*This.Class#_)
EndMacro
Macro Close()
EndProcedure
EndMacro
;-----------------------------------------------------------------
; Exemple : avec deux 'Classes'
; - Soustraction
; - Calcul qui hérite de Soustraction
Interface Soustraction
Soustraction()
EndInterface
Class(Calcul Extends Soustraction)
SetData(a.l, b.l)
Addition()
Multiplication()
Membre(Calcul)
a.l
b.l
EndClass()
Constructor(Calcul)
Debug "--------------------------"
Debug "Constructor"
*This\a = 0
*This\b = 0
Debug "--------------------------"
Close()
Destructor(Calcul)
Debug "--------------------------"
Debug "Destructor"
Debug "--------------------------"
Close()
Method(Calcul, Soustraction))
ProcedureReturn *This\a - *This\b
Close()
Method(Calcul, Setdata), a.l, b.l)
*This\a = a
*This\b = b
Close()
Method(Calcul, Addition))
ProcedureReturn *This\a + *This\b
Close()
Method(Calcul, Multiplication))
ProcedureReturn *This\a * *This\b
Close()
New(*Pointeur, Calcul)
; Modification des valeurs en passant par une fonction
;/*Pointeur\Setdata(5,3)
; Modification directe des valeurs
*pointeur2.calcul_=*pointeur
*pointeur2\a = 5
*pointeur2\b = 3
Debug "Addition = " + Str(*Pointeur\ Addition())
Debug "Multiplication = " + Str(*Pointeur\ Multiplication())
Debug "Soustraction = " + Str(*Pointeur\ Soustraction())
Delete(*Pointeur, Calcul)
DataSection
Calcul:
Data.l @Soustraction(), @SetData(), @Addition(), @Multiplication()
EndDataSection