Page 1 sur 1

Interface - Exemple simple

Publié : dim. 22/mai/2005 20:18
par Dr. Dri
comme j'ai un peu galéré avec le tuto de Heis, je poste un exemple plus simple, pour ceux qui auraient aussi du mal... En tout cas sans le tuto je n'aurais pas compris comment faire... Et puis c'est tout de même intéressant de comprendre le fonctionnement bas niveau d'un concept haut niveau...
(avec un exemple simple ca s'est éclairci pour moi...)

Code : Tout sélectionner

Interface Compteur
  getValeur()
  setValeur(v.l)
  incrementer()
  decrementer()
EndInterface

Structure CompteurTable
  getValeur.l
  setValeur.l
  incrementer.l
  decrementer.l
EndStructure

Structure Compteur_
  *fonctions.Compteur
  valeur.l
EndStructure

Procedure Compteur_getValeur(*this.Compteur_)
  ProcedureReturn *this\valeur
EndProcedure

Procedure Compteur_setValeur(*this.Compteur_, valeur.l)
  If valeur >= 0
    *this\valeur = valeur
  EndIf
EndProcedure

Procedure Compteur_incrementer(*this.Compteur_)
  *this\valeur + 1
EndProcedure

Procedure Compteur_decrementer(*this.Compteur_)
  If *this\valeur > 0
    *this\valeur - 1
  EndIf
EndProcedure

Global CompteurTable.CompteurTable
CompteurTable\getValeur   = @Compteur_getValeur()
CompteurTable\setValeur   = @Compteur_setValeur()
CompteurTable\incrementer = @Compteur_incrementer()
CompteurTable\decrementer = @Compteur_decrementer()

Procedure Compteur() ;constructeur
  *ptr.Compteur_
  *ptr = AllocateMemory( SizeOf(Compteur_) )
  
  ;méthodes
  *ptr\fonctions = CompteurTable
  
  ;variables
  *ptr\valeur = 0
  
  ProcedureReturn *ptr
EndProcedure

Procedure _Compteur(*cpt.Compteur) ;destructeur
  If *cpt <> #Null
    FreeMemory(*cpt)
  EndIf
EndProcedure

cpt.Compteur = Compteur()

cpt\decrementer()

For i = 1 To 10
  cpt\incrementer()
Next i

Debug cpt\getValeur()
_Compteur(cpt)
Dri :)

Publié : dim. 22/mai/2005 20:36
par Oliv
Est-ce que vous pourriez m'éclaircir moi aussi car je ne vois toujours pas à quoi servent les interfaces dans la programmation, à par ce compliquer :oops: ? Pour certains appels à l'API ou moteur 3D je vois, mais dans un programme juste écrit en Pure ?

Publié : dim. 22/mai/2005 23:44
par Dräc
Salut Oliv,

A la base, Fred semble avoir créée l’instruction interface pour « interfacer » avec certaines librairies.
Cependant, il est possible comme tu le vois dans l’exemple de Dr.Dri de l’utiliser dans un programme n’utilisant pas de librairie.
Son intérêt ?
Elle permet d’avoir une notation élégante avec la possibilité de cacher derrière des noms les procédures appelées.
Mais tout son sens lui est donnée si l’on veut créer un objet au sens de la POO
L’instruction interface donne alors accès à une notation permettant de manipuler facilement l’objet tout en étant propice à la notion d’encapsulation, car elle ne donne accès qu’aux seules parties d’un objet qui sont listés dans l’interface (ici la variable « valeur » n’est pas directement accessible à l’utilisateur).

En dehors de cela (pas de librairie ni de POO ), c’est effectivement se compliquer la vie.

La routine présentée ci-dessus n’est donc rien d’autre qu’une implémentation possible d’un objet en PureBasic…

Publié : lun. 23/mai/2005 7:48
par Dr. Dri
LE principal avantage d'un objet c'est qu'une fois qu'il est créé, il devient tres simple à utiliser... ce qui en procédural donnera par exemple :

Code : Tout sélectionner

SetGadgetText(unStringGadget, "un texte")
SetGadgetText(unEditorGadget, "un texte")
deviendra en POO :

Code : Tout sélectionner

unStringGadget.SetText("un texte")
unEditorGadget.SetText("un texte")
à terme on a un code plus structuré et lisible mais souvent moins performant car on a plus d'appels de fonctions... donc quitte à sacrifier tout un fichier qui sera super chiant à créer, ou relire (comme mon exemple ou celui de Heis), on peut ensuite l'utiliser avec includefile et avoir du code plus propre...

Dri ;)

Publié : lun. 23/mai/2005 20:51
par Oliv
Merci :D

Publié : lun. 23/mai/2005 20:52
par Heis Spiter
Oliv a écrit :Merci :D
Apprends bien, Bird Chat 3 sera développé "Full Object" ;).