Vai al contenuto

Impariamo Xojo: Primi passi con le classi

Xojo è un linguaggio basato sugli oggetti, tutto (o quasi) quello che utilizziamo sono oggetti. Vediamo in questo post come possiamo creare i nostri oggetti e modificarne il comportamento.

La creazione di un oggetto in Xojo è molto semplice: una volta creato un progetto selezioniamo dal menu Insert la voce Class e un nuovo oggetto Class1 appare e verrà selezionato nel nostro progetto.

Tramite l’inspector possiamo cambiare nome alla classe.

I Xojo, come in tutti i linguaggi orientati agli oggetti, possiamo creare catene di classi e sottoclassi (dal caso più generale a quello più particolare) definendo quindi l’ereditarietà.

Se la nostra classe ha nell’inspector la voce Super vuota allora la nostra classe è una classe primaria (l’inizio della catena) altrimenti che nella voce Super c’è il nome di una classe allora è figlia di questa classe (e di quelle eventualmente precedenti nella catena) e ne eredita proprietà e metodi.

Alla classe possiamo aggiungere:

Proprietà

Possiamo aggiungere le proprietà necessarie al nostro oggetto e queste saranno disponibili in base allo Scopo definito (a tutto il codice se Pubblica, alla classe e alle sottoclassi se Protetta, solo alla classe se privata).

Le proprietà possono essere di qualsiasi tipo (tipi primitivi, array, classi etc.). Nel caso in cui utilizziamo come tipo una classe bisogna prestare attenzione a non creare blocchi reciproci (le classi fanno riferimento una all’altra) magari utilizzando le weakRef.

Proprietà computate

Le proprietà computate sono delle proprietà con del codice associato alle operazioni di lettura e/o assegnazione. Ad esempio possiamo leggere/modificare una proprietà privata (quello che viene scritto automaticamente come codice quando trasformiamo una proprietà in proprietà computata) e non avere neanche un vera proprietà da leggere/modificare ma solo operazioni particolari.

Possiamo anche scrivere dei metodi per questo (normali che ritornano un valore, con assign per assegnare un valore).

Metodi

I metodi sono le operazioni che vogliamo fare sulla classe, anche questi godono delle visibilità definita dallo scopo.

Costanti

Possiamo associare delle costanti alla classe (di tipo booleano, Stringa  o Text, Numerico o Colore). Le costanti possono avere diversi valori in base alla piattaforma e essere dinamiche in base alla lingua.

Enumerazioni

Le enumerazioni sono la definizione di un tipo che può assumere un ristretto insiemi di valori. Internamente sono degli interi ma devono essere trattati sempre come un tipo a se stante (anche se legato ad una classe).

I nomi che diamo ai vari valori non possono contenere spazi e partono da 0 con numerazione consecutiva. Se dobbiamo avere dei valori definiti, ad esempio una lista di comandi per un oggetto hardware, possiamo far seguire al nome il segno = seguito dal valore numerico intero associato.

Possiamo passare dal valore del tipo a quello intero e viceversa semplicemente con:

//Converto in intero da una enumerazione
dim valore as integer=Integer(miaEnumarazione.miaVoce)
 
//Converto un intero al valore corrispondente dell'enumerazione
dim voce as miaEnumerazione=CType(valoreIntero, miaEnumerazione)

Facendo ovviamente attenzione nel secondo caso al valoreIntero utilizzato che potrebbe non essere compatibile con l’enumerazione definita.

Delegate

Possiamo definire la firma di una funzione (sequenza dei parametri in entrata) che possiamo associare ad una proprietà o ad un parametro in modo da poter invocare funzioni diverse in base a questa firma.

Proprietà / Metodi Shared

Queste proprietà (computate o meno) o metodi sono disponibili alla classe in quanto tale e non solo ad un oggetto istanziato. I metodi, chiaramente, non possono accedere a proprietà della classe direttamente ma solo tramite un oggetto istanziato.

Un esempio di metodo shared è quello che si utilizza per aprire il file di un’immagine ed ottenerne la Picture: in questo caso utilizziamo Picture.Open dove Picture è la classe, mentre Open è il metodo shared.

Eventi

Possiamo definire degli eventi che possono essere richiamati (Raise) dal codice della classe e poi utilizzati (nell’interfaccia nel caso di controlli e con addHandler nel codice) dove la classe viene utilizzata.