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