Basic Univers


; 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