mardi 12 juin 2012

Clipper: Définition des classes en Harbour

La documentation Harbour reprend bien des informations relative à la définition des classes.
Si vous trouverez des exemples dans le guide de référence Harbour, ce dernier ne contient pas d'exemple d'implémentation (Erreur HTTP 404).

Références de base
Voici un petit récapitulatif d'information:
  • CLASS - Définition de la classe (incluant les objets de données et les méthodes) (guide de référence)
  • DATA - Définition des données de la classe (guide de référence)
  • METHOD - Définition des méthodes de la classe (guide de référence).
Exemple d'implémentation
Voici un exemple partiel d'implémentation de classe issu des sources d'Harbour (fichier drawimg.prg)
CLASS wPaintObj FROM wGUIObj
   * image like wvtimage
   DATA cImage
   DATA lTransp

   METHOD New()
   METHOD Draw()
   METHOD Undraw()
   METHOD Hide()
   METHOD Show()
ENDCLASS //wPaintOBJ

METHOD New(nWinNum, nType, cId, nRow1, nCol1, nRow2, nCol2, aOffTLBR, lTransp) CLASS wPaintObj
   default aOffTLBR to {0,0,0,0}
   default lTransp to .f.

   ::nWinNum := nWinNum
   ::lVisible := .t.

   ::nType := nType
   ::cId := cId
   ::nRow1 := nRow1
   ::nCol1 := nCol1
   ::nRow2 := nRow2
   ::nCol2 := nCol2

   if !(valtype(aOffTLBR)=="A")
      aOffTLBR := {0,0,0,0}
   endif

   ::aOffTLBR := aclone(aOffTLBR)

   ::lTransp := lTransp
RETURN Self

METHOD Draw() CLASS wPaintObj
   if !::lVisible
      return NIL
   endif

   do case
      case ::nType==WPAINTOBJ_IMAGE
         if !empty(::cImage)
            WVW_DRAWIMAGE( ::nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ;
                           ::cImage, ::aOffTLBR, ::lTransp )
         endif

      otherwise
         * lBoxErrMessage()
   endcase

RETURN NIL  //DRAW()


Et cet exemple est accompagné du code utilisant cette classe

oWPaint := wPaintObj():New(0, WPAINTOBJ_IMAGE, "TOPLEFT", ntop+1, nleft+1, nmidver-1, nmidhor-1, NIL, ltransp)
oWPaint:cImage := cpict


Constructeur New
Une classe contient généralement un constructeur (appelé New).
Ce dernier retourne une référence vers l'instance de la classe nommé Self

Self et ::
Dans la définition (et l’implémentation) d'une classe, Self fait référence à l'instance de la classe (un objet donc).
Self dispose aussi d'une notation raccourcie qui est ::

Classe et Héritage
Voici un autre exemple qui démontre l'utilisation de l'héritage des classes en Harbour.
Cet exemple est issus de classinh.ch (dans les sources de Harbour)

/*
 * $Id: clasinh.prg 2186 2000-02-14 08:11:56Z vszel $
 */

#include "hbclass.ch"

function main()
   local oObject, oBase
   oObject := TAnyClass():New()
   oBase := TClassBase():New()
return nil

class TClassBase
   method New()
   method Test() INLINE Alert( "Test" )
endclass

method New() class TClassBase
return Self

class TAnyClass from TClassBase
   method New()
endclass

method New() class TAnyClass
   super:New()
   super:Test()
return Self

Aucun commentaire: