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:
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 :
Probeer even samen te vatten:
Maak een classe:
- Maak een Class bij Classes, begint met C bv CProduct
- Er zijn automatisch een aantal _ bewerkingen gedefinieerd, zoals _init ( zie Gambas objects documentatie)
- Maak private objecten voor gebruik binnen de classe (bv een identity)
- Gebruik die waarden door een PUBLIC SUB te maken die de waarde teruggeeft
- Maak PUBLIC variabelen die rechtstreeks aangesproken mogen worden van buitenaf, bv een boolean switch “isValid”.
- 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