Objecten in Gambas: Hoe?

Ik probeer een zicht te krijgen op classes en objecten in Gambas. Er is een wel heel beperkt voorbeeld in de GUI aanwezig (Object – by juergen) waar een object met publieke string en integers wordt gemaakt (create) en vernietigd (destroy)
In de IDE wordt met een knop een object gemaakt en een waarde gegeven voor Name:
PUBLIC SUB btnCreateThing_Click()
myThing = NEW ClsThing
myThing.Name = "Dummy-Thing"

De class van het object, ClsThing:
' Gambas class file

PUBLIC Name AS String
PUBLIC X AS Integer
PUBLIC Y AS Integer
PUBLIC ID AS Integer

PUBLIC SUB tellaboutme() AS String

RETURN "I am: " & ME.Name & ", X= " & ME.X & ", Y= " & ME.Y & ", ID= " & ME.ID

END

De methode “tellaboutme” heb ik toegevoegd.

Nog uit te zoeken:
– hoe property initialiseren met een waarde (bv de X en de Y)
– hoe properties alleen leesbaar – niet wijzigbaar maken
(door ze onzichtbaar te maken en method voor uitlezen te gebruiken?)
– hoe zoiets als die ID als een serienummer van het object op een automatische manier laten initialiseren of toekennen bij creatie?
– hoe een verzameling van objecten maken, meer bepaald een array van objecten?
– hoe objecten opslaan (persistance?)

Er zijn volgens de documentatie een aantal speciale methodes vastgelegd:

_init Class initializatie.
_exit Class opkuisen.
_new Object instanciation.
_free Object vrijgeven.
_next Object or class enumeration.
_get Array read operator (lezen).
_put Array write operator (schrijven).
_call Om object of de class te gebruiken als een methode.
_unknown Een onbekende methode of eigenschap aanroepen.

Toegevoegd aan bovenstaand voorbeeld: zichtbaarheid en initialisatie van properties: screenshot en code:

Object, voorbeeld

de class: ClsThing:

' Gambas class file

PUBLIC sName AS String
PUBLIC iX AS Integer
PUBLIC iY AS Integer
PUBLIC iID AS Integer

PRIVATE iZ AS Integer
PRIVATE iSecret AS Integer

PUBLIC SUB _new()
  
  iZ = 5
  iSecret = 7
  iId = 1
  
END


PRIVATE SUB getSecret() AS Integer
  
  RETURN iSecret
  '  seems that the simple return function is not needed in the class as iSecret is reachable in the class
  ' from outside it is needed, but then the function must be public as with the next example of iZ:
  
END


PUBLIC SUB getZ() AS Integer
  
  RETURN iZ
  
END


PUBLIC SUB tellaboutme() AS String
  
  RETURN "I am: " & ME.sName & ", X= " & ME.iX & ", Y= " & ME.iY & ", Z= " & ME.getZ() & ", ID= " & ME.iID & " my secret is: " & iSecret
  
END

PUBLIC SUB increaseme(OPTIONAL i AS Integer)
  
  INC ME.iX
  INC ME.iY
  
END


en de form:FMain


' Gambas class file

PUBLIC myThing AS ClsThing

STATIC PUBLIC SUB Main()
  DIM myForm AS Form
  myForm = NEW FStart
  myForm.Show
END

PUBLIC SUB btCreateThing_Click()
  myThing = NEW ClsThing
  myThing.sName = "Dummy-Thing"
  ' properties reacheable from outside:
  mything.iX = 11
  mything.iY = 22
  mything.iID = 33 ' overwrites initialisation 
  txlbCheckResult.Text = "Created"
  txlbCheckResult.Visible = TRUE
  txlbCheckResult2.Text = ""
END

PUBLIC SUB btCheckThing_Click()
  txlbCheckResult.Text = myThing.sName & ", X= " & myThing.iX & ", Y= " & myThing.iY & ", ID= " & myThing.iID
'  iZ is not visible outside the class: (error: unknown symbol iZ in class ClsThing)
'  txlbCheckResult.Text &= ", Z= " & myThing.iZ
'  get it with a public method:
  txlbCheckResult.Text &= ", Z= " & myThing.getZ()
'  iSecret is not visible outside the class ..
'  txlbCheckResult.Text &= ", Secret = " & myThing.iSecret
'  .. and also the method is not visible (not public):
'  txlbCheckResult.Text &= ", Z= " & myThing.getSecret()
'  no way to get iSecret!  But it might -indirect- show up somehow:
  txlbCheckResult2.Text = myThing.tellaboutme()
CATCH
  Message(Error.Text)
END

PUBLIC SUB btDestroy_Click()
  myThing = NULL
  txlbCheckResult.Visible = FALSE
END



PUBLIC SUB Form_Open()

  

END

PUBLIC SUB btExit_Click()

  ME.Close

END

PUBLIC SUB btPlus_Click()

  myThing.increaseme()

END


Screenshot :

Object, voorbeeld

Probeer even samen te vatten:
Maak een classe:

  1. Maak een Class bij Classes, begint met C bv CProduct
  2. Er zijn automatisch een aantal _ bewerkingen gedefinieerd, zoals _init ( zie Gambas objects documentatie)
  3. Maak private objecten voor gebruik binnen de classe (bv een identity)
  4. Gebruik die waarden door een PUBLIC SUB te maken die de waarde teruggeeft
  5. Maak PUBLIC variabelen die rechtstreeks aangesproken mogen worden van buitenaf, bv een boolean switch “isValid”.
  6. Persisence: schrijf eventueel de database code in een externe Module; bv MData; je kan die dan aanpassen aan de gebruikte database zonder de objecten te wijzigen. Vanuit de classe spreek je die externe module aan; dus ze moet wel bestaan natuurlijk!

Declareer het object van die classe.
bv

PRIVATE hProduct AS CProduct

Maak er een variabele van:
bv

$hProduct = NEW CProduct

Als dat gebeurd is in de FMain kan je die aanspreken van elders met:
bv als name public is in de classe:

FMain.$hProduct.name

Leave a Reply