Page 1 sur 1

tutoriel Programmation Orientée Objet (POO)

Publié : jeu. 21/avr./2005 23:20
par Heis Spiter
Bonjour à tous !
Comme je vois que la POO commence à trotter dans beaucoup d'esprits, pour éviter que certains parlent sans savoir, j'ai fait un tuto sur la POO. Je n'ai pu encore le tester par manque de temps. Mais je ne tarderais pas à le faire pour corriger et optimiser le code et les informations. Pour l'instant, il n'est dispo que sur mon serveur. Je verrais si je le mets aussi sur 2dev.org
Le lien (j'ai failli l'oublié) : http://www.heisspiter.no-ip.com/tutos.php?tuto=1&page=1
Alors ceux qui ont la critique facile sans arguementation, j'y ai passé 4 heures. Donc, un "c nul" sans rien risque de mal passer ;).
Bonne nuit (oui, il est déjà minuit :()

Publié : ven. 22/avr./2005 8:24
par Crystal Noir
Moi je trouve que c'est bien vu.

Evidemment ensuite c 'est à purebasic qu'il faudrait demander la gestion de la POO. Car comme tu le soulignes dans ton tutoriel, on crée une "class" mais non approfondie.

Ca serait chouette qu'on puisse utiliser les méthodes, l'héritage et le polymorphisme lol.


En tout cas c'est bien vu.

Publié : sam. 23/avr./2005 11:02
par Dräc
Tout d’abord, on ne peut que se réjouir d’un nouveau Tuto !
Merci à toi donc d’avoir pris la peine de nous expliciter « les bases pour une 'Programmation Orientée Object' en PureBasic » :)

Cependant, et c’est un peu normal, il faut avoir un certain niveau pour appréhender correctement ton tuto.
Pourtant, pourquoi n’as tu pas repris en premier lieu ton exemple sur les compteurs ?
http://purebasic.hmt-forum.com/viewtopi ... =interface
Il est en effet plus simple à aborder.

Par la suite, rien ne t’empêchais d’y ajouter celui plus conséquent sur les fichiers, pour lequel tu rajoutes la structure Line propre à ton exemple et qui n’est pas « forcément présente en POO » .

Enfin, l’exemple sur les compteurs montre aussi comme se servir de tout cela. Cela completerait bien ton Tutoriel.

Encore merci. #good

Publié : sam. 23/avr./2005 11:37
par Dräc
Je vous invite tous les deux, Heis Spiter et Crystal Noir, à nous donner > ici < votre sentiment sur les avantages et les inconvénients de la POO et à partager votre expérience.

@Crystal Noir : Finalement les méthodes sont déjà disponibles et décrites dans l’interface!

Publié : sam. 23/avr./2005 21:44
par Heis Spiter
Salut Dräc, premièrement, merci pour ton commentaire constructif. Je vais essayer de te répondre le plus précisément possible.
Si je n'ai pas choisi les compteurs, c'est pour plusieurs raisons. La première, la POO se destine plus à des programmeurs avancés, donc, si je complique en plus le tuto, c'est pas grave ;). Ensuite, cela m'a permis d'aborder aussi l'utilisation de structure. Et enfin, car l'exemple des compteurs, si on l'a déjà vu, on connait déjà tout, et on essait plus forcément de tout bien comprendre.
Mais bon, au vu de ta remarque, je pense que je vais poster un tuto plus complet sur les compteurs sur 2dev.org
Alors pour mon expérience sur la POO, je vais voir, mais en Pure, elle est minime ;).
Bonne soirée.

Publié : dim. 24/avr./2005 7:36
par Cagou-77
Bonjour,

Quelqu'un peut-il m'expliquer pourquoi le code suivant ne marche-t'il pas comme il devrait .

Code : Tout sélectionner

;1 - Programmation Orientée Objet (POO) I

;Voici un tuto pour la POO (Programmation orienté objet).
;Ce tuto va permettre la création d'une class (non approfondie) de gestion de fichiers.
;Tout d'abord, pour la POO de PureBasic,
;il faut déclarer dans une interface toutes les fonctions qui se rapportent à la class.
;Notre class fonctionnera avec 8 fonctions. Je les détaillerais plus bas.
;On nomme l'interface File, pour savoir laquelle c'est (si plusieurs class dans un fichier).

Interface File ;
  InitFile()
  AnalyseFile(File.s)
  GetID()
  GetLinesNumber()
  GetLineX(Number.l)
  GetCharactersNumber()
  GetCharacterX(Number.l)
  FreeFile()
EndInterface

;Maintenant, dans une structure, nous allons créer des variables longues, 
;avec le nom de chaque fonction. Afin de se retrouver dans toutes les structures,
;on utilisera un nom clair :File_Functions.
Structure File_Functions
  InitFile.l
  AnalyseFile.l
  GetID.l
  GetLinesNumber.l
  GetLineX.l
  GetCharactersNumber.l
  GetCharacterX.l
  FreeFile.l
EndStructure

;Celle-ci servira pour toute les variables utilisables seulement dans la class (non accessible à l'extérieur).
;On la note une fois de plus avec un nom explicite.
;La première ligne de la structure est un pointeur vers la structure des fonctions 
;(afin de faire la liaison).
Structure File_Vars
  *VirtualTable.File_Functions
  ID.l
  File.s
  NbLines.l
  NbCharas.l
EndStructure

;On attaque l'avant dernière structure (pas forcément présente en POO). 
;Celle-ci contiendra le contenu des fichiers ainsi que diverses informations. 
;Pour pouvoir l'utiliser de façon optimale, on la déclare en liste chaînée

Structure Line
  ID.l
  Line.s
  Lenght.l
  Number.l
EndStructure
NewList TLine.Line()

;Maintenant que l'essentiel est fait, on peut commencer les procédures. 
;La première est la plus importante. 
;Elle disèque le fichier, et note toutes les informations. 
;Et clos le fichier. Il ne sera plus utilisé jusqu'a la fin du programme
;(ou de la recréation de la classe).
;Cette procédure stoque toutes les informations dans les variables ou dans la Structure
Procedure AnalyseFile(*Self.File_Vars, File.s)
  If *Self\ID = 0
    ID.l = OpenFile(#PB_Any, File)
    If ID
      i = 1
      TotLen = 0
      Repeat
        Line.s = ReadString()
        Lenght.l = Len(Line)+2
        AddElement(TLine())
        TLine()\ID = ID
        TLine()\Line = Line
        TLine()\Lenght = Lenght
        TLine()\Number = i
        i = i+1
        TotLen = TotLen+Lenght
      Until Eof(ID)
      CloseFile(ID)
      *Self\ID = ID
      *Self\File = File
      *Self\NbLines = i
      *Self\NbCharas = TotLen
    EndIf
  EndIf
EndProcedure

;Elle est peu utile. Elle permet d'avoir l'ID (identification) attribuée par PureBasic au fichier.
Procedure GetID(*Self.File_Vars)
  ProcedureReturn *Self\ID
EndProcedure

;Cette fonction retourne le nombre de lignes du fichier.
Procedure GetLinesNumber(*Self.File_Vars)
  ProcedureReturn *Self\NbLines
EndProcedure

;Cette fonction retourne la ligne X du fichier.
Procedure.s GetLineX(*Self.File_Vars, Number.l)
;  Shared LineX.s =""
  ResetList(TLine())
  LineX.s = ""
  For k=0 To CountList(TLine())
    NextElement(TLine())
    If TLine()\ID = *Self\ID And TLine()\Number = Number
      LineX.s = TLine()\Line
      Debug LineX
      Break
    EndIf
  Next k
  ProcedureReturn LineX
EndProcedure

;Cette fonction retourne le nombre de caractères dans le fichier 
;(donc la taille du fichier en octets). 
;La valeur peut parfois être fausse à cause des caractères de fin de ligne.
Procedure GetCharactersNumber(*Self.File_Vars)
   ProcedureReturn *Self\NbCharas
EndProcedure

; Cette fonction retourne le Xième caractère du fichier (ou le Xième octet)
Procedure.s GetCharacterX(*Self.File_Vars, Number.l)
  ResetList(TLine())
  Charac.s = ""
  NbTot = 0
  For k = 0 To CountList(TLine())
    NextElement(TLine())
    If TLine()\ID = *Self\ID
      NbTot = NbTot+TLine()\Lenght
      If NbTot > Number
        Pos = Number-(NbTot-TLine()\Lenght)
        If Lenght-Pos = 1 Or Lenght-Pos = 0
          If Lenght-Pos = 1
            Charac.s = Chr(13)
          ElseIf Lenght-Pos = 0
            Charac.s = Chr(10)
          EndIf
        Else
          Charac.s = Mid(TLine()\Line, Pos, 1)
        EndIf
        Break
      EndIf
    EndIf
  Next k
  ProcedureReturn Charac
EndProcedure

;Elle met en commun les fonctions et les variables. 
;Il faut la déclarer en liste chaînée pour pouvoir l'utiliser à chaque appel de la class.
Structure File_Holder
  VT.File_Functions
  Impl.File_Vars
EndStructure

NewList Instances.File_Holder()

;Cette fonction permet de supprimer une instance  de la class. 
;Elle supprime toutes les données.
Procedure FreeFile(*Self.File_Vars)
  ResetList(TLine())
  List = CountList(TLine())
  For k = 0 To List
    NextElement(TLine())
    If TLine()\ID = *Self\ID
      DeleteElement(TLine())
    EndIf
  Next k
  *Self\ID = 0
  *Self\File = ""
  *Self\NbLines = 0
  *Self\NbCharas = 0
  DeleteElement(Instances())
EndProcedure

;Celle-ci permet de créer une instance de la class. 
;Cela permettra de pouvoir utiliser plus tard un fichier. 
;On déclare dedans toutes les fonctions et variables. 
;On créé aussi les liaisons vers les structures nécessaires.
Procedure InitFile()
  AddElement(Instances())
  Instances()\VT\AnalyseFile = @AnalyseFile()
  Instances()\VT\GetID = @GetID()
  Instances()\VT\GetLinesNumber = @GetLinesNumber()
  Instances()\VT\GetLineX = @GetLineX()
  Instances()\VT\GetCharactersNumber = @GetCharactersNumber()
  Instances()\VT\GetCharacterX = @GetCharacterX()
  Instances()\VT\FreeFile = @FreeFile()
  Instances()\Impl\VirtualTable = Instances()\VT
  Instances()\Impl\ID = 0
  Instances()\Impl\File = ""
  Instances()\Impl\NbLines = 0
  Instances()\Impl\NbCharas = 0
  ProcedureReturn @Instances()\Impl
EndProcedure

Test.File = InitFile()
Test\AnalyseFile(?????????); REMPLACER LES ??????? PAR UN NOM DE FICHIER .
Debug Test\GetLinesNumber()
Debug Test\GetCharactersNumber()
Debug Test\GetLineX(2); POURQUOI CELA N'AFFICHE PAS LA LIGNE ?
Debug Test\GetCharacterX(100)
J'ai programmé en Clipper avec de la POO il y a quelque années et je
voudrait me remettre dans le bain, mais la conception des objets diffère un peu j'ai trouvé cet exemple mais il bug et je n'arriva pas à savoir pourquoi .

Merci d'avance
( je pense que l'on devrait étendre les tutos sur ce sujet car la POO est trés intéressante à programmer quand on a assimilé cette façon de programmer .)

Publié : dim. 24/avr./2005 7:45
par Cagou-77
Un autre exemple de POO

Code : Tout sélectionner

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8048&highlight=
; Author: Justin
; Date: 25. October 2003


;Autocomplete object
;Justin 10/03

; Just to play a little with the new functions. An object that makes an autocomplete
; in an editbox / listbox. It's a working example, note that you have to use setsel()
; if the selected listbox index changes outside the object, i did this to improve the
; speed, rather than checking the selected index for every edit change inside the object.
; Only for windows.

Interface IPBAutoComplete
  FindStr(str$)
  SetEdit(id)
  SetListBox(id)
  SetSel(isel)
EndInterface

Structure PBAutoCompleteFunctions
  FindStr.l
  SetEdit.l
  SetListBox.l
  SetSel.l
EndStructure

Structure OPBAutoComplete
  *VTable.PBAutoCompleteFunctions
  hwndedit.l
  hwndlistbox.l
  idedit.l
  idlistbox.l
  iselected.l
EndStructure

;finds and select the passed string
Procedure FindStr(*Object.OPBAutoComplete,str$)
  hwndlistbox=*Object\hwndlistbox
  istr=SendMessage_(hwndlistbox,#LB_FINDSTRING,-1,str$)
  If istr<>-1
    ;skip if item is selected
    If *Object\iselected=istr : ProcedureReturn : EndIf
    textlen=Len(str$)
   
    newtextlen=SendMessage_(hwndlistbox,#LB_GETTEXTLEN,istr,0)
    seltextlen=newtextlen-textlen
   
    ;select
    SendMessage_(hwndlistbox,#LB_SETCURSEL,istr,0)
    ;set edit text
    SetGadgetText(*Object\idedit,GetGadgetItemText(*Object\idlistbox,istr,-1))
    ;set selected text
    SendMessage_(*Object\hwndedit,#EM_SETSEL,textlen,newtextlen)
   
    ;update index
    *Object\iselected=istr
  EndIf
EndProcedure

;sets the editbox for this object
;id : editbox id
Procedure SetEdit(*Object.OPBAutoComplete,id)
  *Object\idedit=id
  *Object\hwndedit=GadgetID(id)
EndProcedure

;sets the listbox for this object
;id : listbox id
Procedure SetListBox(*Object.OPBAutoComplete,id)
  *Object\idlistbox=id
  *Object\hwndlistbox=GadgetID(id)
EndProcedure

;sets the selected listbox index
;iselected : index of selected item
;you are responsable to update this index every time it changes
;-1 = no selection
Procedure SetSel(*Object.OPBAutoComplete,iselected)
  *Object\iselected=iselected
EndProcedure

PBAutoCompleteFunctions.PBAutoCompleteFunctions\FindStr=@FindStr()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetEdit=@SetEdit()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetListBox=@SetListBox()
PBAutoCompleteFunctions.PBAutoCompleteFunctions\SetSel=@SetSel()

OPBAutoComplete.OPBAutoComplete\VTable=PBAutoCompleteFunctions

;-----------------------------------------------------------------
;CODE

;GADGET IDs
#String0=0
#ListView1=1

;WINDOW ID
#Window1=0

;WINDOW
OpenWindow(#Window1,150,70,550,350,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_TitleBar,"Auto Complete")
CreateGadgetList(WindowID(#Window1))

StringGadget(#String0,10,8,310,24,"")
ListViewGadget(#ListView1,11,49,308,262)

AddGadgetItem(#ListView1,-1,"Red")
AddGadgetItem(#ListView1,-1,"Green")
AddGadgetItem(#ListView1,-1,"Blue")
AddGadgetItem(#ListView1,-1,"Yellow")
AddGadgetItem(#ListView1,-1,"Black")
AddGadgetItem(#ListView1,-1,"White")
AddGadgetItem(#ListView1,-1,"Pink")
AddGadgetItem(#ListView1,-1,"Purple")
AddGadgetItem(#ListView1,-1,"Gray")
AddGadgetItem(#ListView1,-1,"Orange")

ActivateGadget(#String0)

;create object
OAutoCP.IPBAutoComplete=@OPBAutoComplete

;init object
OAutoCP\SetEdit(#String0)
OAutoCP\SetListBox(#ListView1)
OAutoCP\SetSel(-1) ;no items selected

;EVENT LOOP
Repeat
  EvID=WaitWindowEvent()
  Select EvID
  Case #PB_Event_Gadget
    Select EventGadgetID()
    Case #String0
      Select EventType()
      Case #PB_EventType_Change
        str$=GetGadgetText(#String0)
        OAutoCP\FindStr(str$)
      EndSelect
     
    Case #ListView1 ;important to update selected index in object
      isel=GetGadgetState(#ListView1)
      ;update selected index
      OAutoCP\SetSel(isel)
      ;set selected in edit
      str$=GetGadgetItemText(#ListView1,isel,-1)
      SetGadgetText(#String0,str$)
    EndSelect
  EndSelect
Until EvID=#PB_EventCloseWindow
Pour ceux que ça peut intéresser

Publié : dim. 24/avr./2005 8:19
par Heis Spiter
J'aurais dû tester avant :(. C'est corrigé (par une simple astuce de programmation ;)). Je te poste le nouveau code, et je corrige le tuto.

Code : Tout sélectionner

;1 - Programmation Orientée Objet (POO) I 

;Voici un tuto pour la POO (Programmation orienté objet). 
;Ce tuto va permettre la création d'une class (non approfondie) de gestion de fichiers. 
;Tout d'abord, pour la POO de PureBasic, 
;il faut déclarer dans une interface toutes les fonctions qui se rapportent à la class. 
;Notre class fonctionnera avec 8 fonctions. Je les détaillerais plus bas. 
;On nomme l'interface File, pour savoir laquelle c'est (si plusieurs class dans un fichier). 

Interface File ; 
  InitFile() 
  AnalyseFile(File.s) 
  GetID() 
  GetLinesNumber() 
  GetLineX(Number.l, Out.l) 
  GetCharactersNumber() 
  GetCharacterX(Number.l, Out.l) 
  FreeFile() 
EndInterface 

;Maintenant, dans une structure, nous allons créer des variables longues, 
;avec le nom de chaque fonction. Afin de se retrouver dans toutes les structures, 
;on utilisera un nom clair :File_Functions. 
Structure File_Functions 
  InitFile.l 
  AnalyseFile.l 
  GetID.l 
  GetLinesNumber.l 
  GetLineX.l 
  GetCharactersNumber.l 
  GetCharacterX.l 
  FreeFile.l 
EndStructure 

;Celle-ci servira pour toute les variables utilisables seulement dans la class (non accessible à l'extérieur). 
;On la note une fois de plus avec un nom explicite. 
;La première ligne de la structure est un pointeur vers la structure des fonctions 
;(afin de faire la liaison). 
Structure File_Vars 
  *VirtualTable.File_Functions 
  ID.l 
  File.s 
  NbLines.l 
  NbCharas.l 
EndStructure 

;On attaque l'avant dernière structure (pas forcément présente en POO). 
;Celle-ci contiendra le contenu des fichiers ainsi que diverses informations. 
;Pour pouvoir l'utiliser de façon optimale, on la déclare en liste chaînée 

Structure Line 
  ID.l 
  Line.s 
  Lenght.l 
  Number.l 
EndStructure 
NewList TLine.Line() 

;Maintenant que l'essentiel est fait, on peut commencer les procédures. 
;La première est la plus importante. 
;Elle disèque le fichier, et note toutes les informations. 
;Et clos le fichier. Il ne sera plus utilisé jusqu'a la fin du programme 
;(ou de la recréation de la classe). 
;Cette procédure stoque toutes les informations dans les variables ou dans la Structure 
Procedure AnalyseFile(*Self.File_Vars, File.s) 
  If *Self\ID = 0 
    ID.l = OpenFile(#PB_Any, File) 
    If ID 
      i = 1 
      TotLen = 0 
      Repeat 
        Line.s = ReadString() 
        Lenght.l = Len(Line)+2 
        AddElement(TLine()) 
        TLine()\ID = ID 
        TLine()\Line = Line 
        TLine()\Lenght = Lenght 
        TLine()\Number = i 
        i = i+1 
        TotLen = TotLen+Lenght 
      Until Eof(ID) 
      CloseFile(ID) 
      *Self\ID = ID 
      *Self\File = File 
      *Self\NbLines = i 
      *Self\NbCharas = TotLen 
    EndIf 
  EndIf 
EndProcedure 

;Elle est peu utile. Elle permet d'avoir l'ID (identification) attribuée par PureBasic au fichier. 
Procedure GetID(*Self.File_Vars) 
  ProcedureReturn *Self\ID 
EndProcedure 

;Cette fonction retourne le nombre de lignes du fichier. 
Procedure GetLinesNumber(*Self.File_Vars) 
  ProcedureReturn *Self\NbLines 
EndProcedure 

;Cette fonction retourne la ligne X du fichier. 
Procedure GetLineX(*Self.File_Vars, Number.l, Out.l) 
;  Shared LineX.s ="" 
  ResetList(TLine()) 
  LineX.s = "" 
  For k=0 To CountList(TLine()) 
    NextElement(TLine()) 
    If TLine()\ID = *Self\ID And TLine()\Number = Number 
      LineX.s = TLine()\Line 
      Break 
    EndIf 
  Next k 
  PokeS(Out, LineX)
EndProcedure 

;Cette fonction retourne le nombre de caractères dans le fichier 
;(donc la taille du fichier en octets). 
;La valeur peut parfois être fausse à cause des caractères de fin de ligne. 
Procedure GetCharactersNumber(*Self.File_Vars) 
   ProcedureReturn *Self\NbCharas 
EndProcedure 

; Cette fonction retourne le Xième caractère du fichier (ou le Xième octet) 
Procedure GetCharacterX(*Self.File_Vars, Number.l, Out.l)
  ResetList(TLine()) 
  Charac.s = "" 
  NbTot = 0 
  For k = 0 To CountList(TLine()) 
    NextElement(TLine()) 
    If TLine()\ID = *Self\ID 
      NbTot = NbTot+TLine()\Lenght
      If NbTot > Number 
        Pos = Number-(NbTot-TLine()\Lenght) 
        If Lenght-Pos = 1 Or Lenght-Pos = 0 
          If Lenght-Pos = 1 
            Charac.s = Chr(13) 
          ElseIf Lenght-Pos = 0 
            Charac.s = Chr(10) 
          EndIf 
        Else 
          Charac.s = Mid(TLine()\Line, Pos, 1)
        EndIf
        Break
      EndIf 
    EndIf 
  Next k 
  PokeS(Out, Charac)
EndProcedure

;Elle met en commun les fonctions et les variables. 
;Il faut la déclarer en liste chaînée pour pouvoir l'utiliser à chaque appel de la class. 
Structure File_Holder 
  VT.File_Functions 
  Impl.File_Vars 
EndStructure 

NewList Instances.File_Holder() 

;Cette fonction permet de supprimer une instance  de la class. 
;Elle supprime toutes les données. 
Procedure FreeFile(*Self.File_Vars) 
  ResetList(TLine()) 
  List = CountList(TLine()) 
  For k = 0 To List 
    NextElement(TLine()) 
    If TLine()\ID = *Self\ID 
      DeleteElement(TLine()) 
    EndIf 
  Next k 
  *Self\ID = 0 
  *Self\File = "" 
  *Self\NbLines = 0 
  *Self\NbCharas = 0 
  DeleteElement(Instances()) 
EndProcedure 

;Celle-ci permet de créer une instance de la class. 
;Cela permettra de pouvoir utiliser plus tard un fichier. 
;On déclare dedans toutes les fonctions et variables. 
;On créé aussi les liaisons vers les structures nécessaires. 
Procedure InitFile() 
  AddElement(Instances()) 
  Instances()\VT\AnalyseFile = @AnalyseFile() 
  Instances()\VT\GetID = @GetID() 
  Instances()\VT\GetLinesNumber = @GetLinesNumber() 
  Instances()\VT\GetLineX = @GetLineX()
  Instances()\VT\GetCharactersNumber = @GetCharactersNumber() 
  Instances()\VT\GetCharacterX = @GetCharacterX() 
  Instances()\VT\FreeFile = @FreeFile() 
  Instances()\Impl\VirtualTable = Instances()\VT 
  Instances()\Impl\ID = 0 
  Instances()\Impl\File = "" 
  Instances()\Impl\NbLines = 0 
  Instances()\Impl\NbCharas = 0 
  ProcedureReturn @Instances()\Impl 
EndProcedure 

Test.File = InitFile() 
Test\AnalyseFile("???????")
Debug Test\GetLinesNumber()
Debug Test\GetCharactersNumber()
*Buffer = AllocateMemory(1024)
Test\GetLineX(2, *Buffer)
Debug PeekS(*Buffer)
*Buffer = ReAllocateMemory(*Buffer, 8)
Test\GetCharacterX(100, *Buffer)
Debug PeekS(*Buffer)

Publié : dim. 24/avr./2005 8:59
par Dräc
Cagou-77 a écrit :J'ai programmé en Clipper avec de la POO il y a quelque années et je
voudrait me remettre dans le bain, mais la conception des objets diffère un peu j'ai trouvé cet exemple mais il bug et je n'arriva pas à savoir pourquoi .

Merci d'avance
( je pense que l'on devrait étendre les tutos sur ce sujet car la POO est trés intéressante à programmer quand on a assimilé cette façon de programmer .)
J’aimerai te mettre en garde pour ce qui est de la POO en Pure :
PureBasic ne permet pas de faire de la POO et le fait que tu trouves en ces exemples des différences avec ce que tu as connu n’est pas étonnant.
Actuellement Pure permet, via les interfaces, d’interfacer avec des librairies à l’architecture OO.
Il est possible, comme on le voit ici, de se servir des interfaces aussi pour agrémenter son code d’une écriture POO.
Il faut néanmoins prendre la peine de créer soit même tous les composants nécessaires à cela, principalement ce qui est appelé ici VirtualTable comportant les adresses des fonctions.
Or, en POO, cette chose est normalement transparente (pris en charge par le compilateur).

Une fois ceci fait, on dispose effectivement d’une commodité d’écriture rappelant un objet.
On peut créer une variable typé de cet objet : c’est l’instanciation.
On dispose alors des méthodes d’écrites dans l’interface

Mais disons que c’est tout : Pas d’héritage ni de polymorphisme qui font que l’on dispose d’une vraie POO, même si certaines choses peuvent s’apparenter à l’héritage et je pense au parametre Extends de l’instruction Interface.

Donc soyons clair, pas de POO en Pure, mais rien ne nous empêche d’essayer de creuser dans cette direction!
Comme le dit la doc, les interface posent « les bases pour une 'Programmation Orientée Object' en PureBasic » :D

Publié : mer. 27/avr./2005 20:31
par Dräc
Je me suis relu et je voulais préciser:
La POO introduit des concepts (polymorphisme, héritage…) dans un langage en l’enrichissant, à cet effet, d’instructions et syntaxes qui, en réalité, ne modifient en rien l’aspect de la compilation par rapport à un langage non-objet.
Il faut s’imaginer que la POO est une sorte de couche, appliquée à un langage procédural, qui est adaptée à l’application des concepts qu’elle propose.
Donc, bien que Pure ne soit pas OO, on peut implémenter les concepts POO (vive les pointeurs et les pointeurs de fonctions).
Le prix est une lisibilité moindre, un peu de rigueur et quelques complications d’implémentation comme l’héritage multiple.
Cependant grâce à l’instruction Interface, ca devient déjà plus sympa :)