D'une part y'a moyen de ne plus utiliser de Global mais en plus on peut faire joujou avec les With

La structure des fonctions a pu disparaître en utilisant la DataSection et l'affectation des adresses des fonctions peut se faire en une seule ligne.
Code : Tout sélectionner
; Déclaration des fonctions que verra l'utilisateur.
; Il est obligatoire de créer des fonctions pour modifier les "paramètres"
; de l'objet car les paramètres ne sont pas accessibles directement.
Interface Math_Object
SetX(x.l)
GetX.l()
SetY(y.l)
GetY.l()
Add.l()
Free()
EndInterface
; Déclaration de la structure "interne" de l'objet (non visible par l'utilisateur,
; d'où les fonctions).
; Ici on déclarera les variables de l'objet (x et y) mais aussi
; un pointeur pour les fonctions.
Structure Math_Object_Structure
*Functions.Math_Object
x.l
y.l
EndStructure
; Les procédures de l'objet
; Le paramètre *Self permet de faire référence à l'objet qui a été créé.
; *Self permet d'accéder aux procédures et aux propriétés
; (les variables x et y) de l'objet.
Procedure SetX(*Self.Math_Object_Structure, x.l)
*Self\x = x
EndProcedure
Procedure.l GetX(*Self.Math_Object_Structure)
ProcedureReturn *Self\x
EndProcedure
Procedure SetY(*Self.Math_Object_Structure, y.l)
*Self\y = y
EndProcedure
Procedure.l GetY(*Self.Math_Object_Structure)
ProcedureReturn *Self\y
EndProcedure
Procedure.l Add(*Self.Math_Object_Structure)
ProcedureReturn *Self\x + *Self\y
Debug *Self\x + *Self\y
EndProcedure
; Ici c'est le "Destructeur" qui va permettre de libérer la mémoire et donc
; il détruit l'objet.
; Il peut être utile de faire certaines tâches avant le FreeMemory comme
; fermer un fichier.
Procedure Free(*Self.Math_Object_Structure)
FreeMemory(*Self)
EndProcedure
; A l'inverse du destructeur voici le "Constructeur" qui va allouer un espace
; en mémoire pour contenir l'objet.
; Il peut être utile d'effectuer certaines initialisations de votre classe.
Procedure NewMathObject()
; allocation de la mémoire
*new.Math_Object_Structure = AllocateMemory(SizeOf(Math_Object_Structure))
*new\Functions = ?Functions ;<-- copie des adresses de nos fonctions
*new\x = 0 ;<-- une initialisation
ProcedureReturn *new
EndProcedure
MonMath1.Math_Object = NewMathObject() ; création d'un objet
MonMath1\SetX(5)
MonMath1\SetY(10)
MonMath2.Math_Object = NewMathObject() ; soyons fous, on va en créer un second
With MonMath2
\SetX(MonMath1\GetX() + 1) ; on peut utiliser un autre objet dans le with
\SetY(3)
Debug \Add() ; petit bug dans la Beta 2, remplacez \Add() par MonMath2\Add()
Debug MonMath1\GetX()
Debug MonMath1\GetY()
Debug \GetX() ; même bug
Debug \GetY() ; et encore
\Free() ; on libère l'objet
EndWith
MonMath1\Free() ; on détruit celui-là aussi
; Ici la section de données permet de placer les adresses des fonctions.
; Il est IMPERATIF que l'ordre des fonctions ici soit identique à l'ordre
; dans l'interface (Math_Object).
DataSection
Functions:
Data.l @SetX(), @GetX(), @SetY()
Data.l @GetY(), @Add(), @Free() ;<-- on peut les placer sur plusieurs lignes
EndDataSection