Interface & Pseudo POO (Un peu pompeux ce terme)
Publié : dim. 29/nov./2015 0:50
Ok POO est une appellation tendancieuse car ce que je vais tacher d'expliquer n'a qu'un rapport lointain avec la POO tel qu'il existe.
■ Objectif : Créer une classe Rectangle contenant les procédures :
- Perimetre()
- Surface()
- Destroy()
A la fin de ce tutoriel vous saurez initialiser un terrain ou n'importe quelle forme rectangulaire avec cette classe Rectangleet de calculer par exemple la surface
■ Nous allons définir une interface contenant ces procédures■ Puis nous allons définir une structure contenant les données à exploiter à savoir pour un rectangle : la longueur et la largeur.■ ARhhHHHhh mais qu'est ce que c'est que ce *DSVT !! ? C'est un handle qui pointe dans une DataSection contenant les adresses des procédures référencées dans l'interface.pas trop compliqué pour le moment je pense. Passons à la suite qui va consister à instancier la classe.
■ Instancier notre classe rectangle consiste à l'initialiser avec des valeurs. Il s'agira de lui fournir la longueur et la largeur de notre rectangle via une procédure. Nous appellerons cette procédure RectangleInit()■ Reste à créer les méthodes c'est à dire les deux procédures permettant de calculer le Perimetre et la Surface ainsi que la procédure permettant de de détruire une allocation mémoire d'un rectangle quand on en a plus besoin.
Pour le moment on va juste créer les 3 procédures juste avec un débug de passage dans chacune d'elle.
■ Voila pour les préliminaires. Reste plus qu'a effectuer un test.
L'initialisation d'un rectangle de longueur 3 et de largeur 2 va s'effectuer de cette manière :L'appel des procédures se fera de cette manière:
■ Le code complet que vous pouvez tester. Pour le moment il n'y a aucun calcul. Ce sera l'objet du chapitre ci-dessous.
■ Objectif : Créer une classe Rectangle contenant les procédures :
- Perimetre()
- Surface()
- Destroy()

Code : Tout sélectionner
MonTerrain.NewRectangle = RectangleInit(20,10)
Code : Tout sélectionner
Debug MonTerrain\Surface()
Code : Tout sélectionner
Interface NewRectangle
Perimetre.i()
Surface.i()
Destroy.i()
EndInterface
Code : Tout sélectionner
;Définition des parametres du rectangle
Structure Rectangle
*DSVT ;Data Section Virtual Table
Longueur.i
Largeur.i
EndStructure
Code : Tout sélectionner
DataSection
Class:
Data.i @Perimetre()
Data.i @Surface()
Data.i @Destroy()
EndDataSection
■ Instancier notre classe rectangle consiste à l'initialiser avec des valeurs. Il s'agira de lui fournir la longueur et la largeur de notre rectangle via une procédure. Nous appellerons cette procédure RectangleInit()
Code : Tout sélectionner
;Initialisation d'un rectangle (Instancialisation)
Procedure.i RectangleInit(Longueur=0, Largeur=0)
Protected *Object.Rectangle
;Allocation mémoire pour un nouveau modèle de classe.
*Object = AllocateMemory(SizeOf(Rectangle))
;L'objet est prêt : Quels sont les pointeurs de procédures ?
If *Object
*Object\DSVT = ?Class
;Initialise la longueur et la largeur d'un rectangle.
*Object\Longueur = Longueur
*Object\Largeur = Largeur
EndIf
;Retourne un pointeur de notre objet.
ProcedureReturn *object
EndProcedure
Pour le moment on va juste créer les 3 procédures juste avec un débug de passage dans chacune d'elle.
Code : Tout sélectionner
Procedure Perimetre()
Debug "Hello de périmetre"
EndProcedure
Procedure Surface()
Debug "Hello de Surface"
EndProcedure
Procedure Destroy()
Debug "Hello de Destroy"
EndProcedure
L'initialisation d'un rectangle de longueur 3 et de largeur 2 va s'effectuer de cette manière :
Code : Tout sélectionner
Rectangle.NewRectangle = RectangleInit(3, 2)
Code : Tout sélectionner
Rectangle\Perimetre()
Rectangle\Surface()
Rectangle\Destroy()
Code : Tout sélectionner
;Définition d'une interface contenant les procédures
Interface NewRectangle
Perimetre.i()
Surface.i()
Destroy.i()
EndInterface
;Définition des parametres du rectangle
Structure Rectangle
*DSVT ;Data Section Virtual Table
Longueur.i
Largeur.i
EndStructure
;Initialisation d'un rectangle (Instancialisation)
Procedure.i RectangleInit(Longueur=0, Largeur=0)
Protected *Object.Rectangle
;Allocation mémoire pour un nouveau modèle de classe.
*Object = AllocateMemory(SizeOf(Rectangle))
;L'objet est pret : Quels sont les pointeurs de procédures ?
If *Object
*Object\DSVT = ?Class
;Initialise la longueur et la largeur d'un rectangle.
*Object\Longueur = Longueur
*Object\Largeur = Largeur
EndIf
;Retourne un pointeur de notre objet.
ProcedureReturn *object
EndProcedure
;Les procédures référencées dans l'interface NewRectangle (Les méthodes)
Procedure Perimetre()
Debug "Hello de périmetre"
EndProcedure
Procedure Surface()
Debug "Hello de Surface"
EndProcedure
Procedure Destroy()
Debug "Hello de Destroy"
EndProcedure
;Reférencement des adresses de procédures disponibles pour cette classe
DataSection
Class:
Data.i @Perimetre()
Data.i @Surface()
Data.i @Destroy()
EndDataSection
;Zone de test
;Initialisation d'un nouveau rectangle
MonTerrain.NewRectangle = RectangleInit(2,3)
;Test des procédure disponible pour cette class
MonTerrain\Perimetre()
MonTerrain\Surface()
MonTerrain\Destroy()