Cela peut être bien souvent pratique...
Exemple:
Imaginer un logiciel de dessin, le dessin en lui-même se compose de différentes formes géométriques, des cercles; des carrés; des rectangles etc...
D'avance on ne peux pas connaitre le type de forme qui compose le dessin. Avec une même méthode pour dessiner le dessin cela devient vraiment pratique.
Car si par après je veux faire évoluer le logiciel et ajouter par exemple des triangles il me suffira de créer une nouvelle classe triangle.
Comment faire avec Pb:
On crée une interface (abstraite) qui va uniquement prendre les méthodes communes au objets.
Toutes les interfaces des objets hériteront de cette interface.
ATTENTION: le datasection doit scrupuleusement respecté l'ordre de l'interface (abstraite) suivi des méthodes propre ) l'objet
Exemple ci-dessous avec un calcul de surface:
remarque: pour une meilleur compréhension, je n'ai ajouté aucune méthode propre au objets
Code : Tout sélectionner
Interface form
getSurface.s()
EndInterface
; class pour les carré
DeclareModule Carre
Declare new(mySize)
EndDeclareModule
Module Carre
Structure _object
*methods
size.l
EndStructure
Procedure new(mySize)
Protected *this._object = AllocateStructure(_object)
With *this
\size=mySize
\methods=?METHODS
ProcedureReturn *this
EndWith
EndProcedure
Procedure.s getSurface(*this._object)
With *this
Protected.f s=\size * \size
ProcedureReturn "La surface du carré est de "+StrF(s,2)
EndWith
EndProcedure
DataSection
METHODS:
Data.i @getSurface()
EndDataSection
EndModule
; class pour les rectangle
DeclareModule Rectangle
Declare new(width,height)
EndDeclareModule
Module Rectangle
Structure _object
*methods
width.l
height.l
EndStructure
Procedure new(width,height)
Protected *this._object = AllocateStructure(_object)
With *this
\width=width
\height=height
\methods=?METHODS
ProcedureReturn *this
EndWith
EndProcedure
Procedure.s getSurface(*this._object)
With *this
Protected.f s=\width * \height
ProcedureReturn "La surface du rectangle est de "+StrF(s,2)
EndWith
EndProcedure
DataSection
METHODS:
Data.i @getSurface()
EndDataSection
EndModule
; class pour les cercle
DeclareModule Circle
Declare new(radius)
EndDeclareModule
Module Circle
Structure _object
*methods
radius.l
EndStructure
Procedure new(radius)
Protected *this._object = AllocateStructure(_object)
With *this
\radius=radius
\methods=?METHODS
ProcedureReturn *this
EndWith
EndProcedure
Procedure.s getSurface(*this._object)
With *this
Protected.f s=Pow(\radius,2) * 3.14
ProcedureReturn "La surface du cercle est de "+StrF(s,2)
EndWith
EndProcedure
DataSection
METHODS:
Data.i @getSurface()
EndDataSection
EndModule
Global NewList myForm.form()
; Ajout d'un carré
AddElement(myForm())
myForm()=Carre::new(15)
; Ajout d'un rectangle
AddElement(myForm())
myForm()=Rectangle::new(25,32)
; Ajout d'un cercle
AddElement(myForm())
myForm()=Circle::new(18)
;lecture des surfaces
ForEach myForm()
Debug myForm()\getSurface()
Next