[V4] POO & Interfaces
Publié : dim. 12/févr./2006 2:21
J'avais fait y'a un moment un petit code pour montrer le fonctionnement des interfaces et grâce aux nouvelles possibilités de la V4 de PB le fonctionnement est légèrement plus simple.
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.
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