Differenze tra le versioni di "Metodi nascosti"

Da Gambas-it.org - Wikipedia.
 
Riga 22: Riga 22:
 
Cosa abbiamo ottenuto? Bè, nulla di particolare... abbiamo solo detto a Gambas che la '''Form''' ora accetta un parametro, di tipo '''String[]''' !
 
Cosa abbiamo ottenuto? Bè, nulla di particolare... abbiamo solo detto a Gambas che la '''Form''' ora accetta un parametro, di tipo '''String[]''' !
  
Questa possibilità è solo permessa attraverso questo metodo nascosto, altrimenti la cosa non sarebbe stata possibile, se non attraverso metodi poco ortodossi (come, ad esempio, variabili globali), e questo permette di condizionare enormemente la '''Form'''.
+
Questa possibilità è solo permessa attraverso questo metodo nascosto, altrimenti la cosa non sarebbe stata fattibile, se non attraverso metodi poco ortodossi (come, ad esempio, delle variabili globali), e questo permette di condizionare enormemente un oggetto.
Se, come da esempio, ci salviamo il parametro in una variabile privata della classe (nell'esempio: $arr), possiamo poi gestire i suoi dati all'interno della classe, modificarli e, magari restituirli alla chiusura della '''Form'''.
+
Se, come da esempio, salviamo il parametro in una variabile privata della classe (nell'esempio: $arr), possiamo poi gestire i suoi dati all'interno della classe, modificarli e, magari restituirli alla chiusura della '''Form'''.
Un'altra ottima caratteristica di questo metodo, è il fatto che il suddetto viene sempre e comunque invocato alla creazione della classe, prima di qualunque altro metodo, per cui rende possibile condizionare totalmente la gestione della classe stessa; nessun evento e nessun'altra funzione sarà chiamata o attivata, se non dopo l'esecuzione del metodo '''_new()''' (il Costruttore!).
+
Un'altra ottima caratteristica di questo metodo, è il fatto che il suddetto viene sempre e comunque invocato alla creazione della classe, prima di qualunque altro, per cui rende possibile condizionare totalmente la gestione della classe stessa; nessun evento e nessun'altra funzione sarà chiamata o attivata, se non dopo l'esecuzione del metodo '''_new()''' (il Costruttore!).
  
Non esistono limitazioni sulla posizione del motodo all'interno del codice ma, se presente verrà invocato.
+
Non esistono limitazioni sulla posizione del metodo all'interno del codice ma, se presente verrà invocato.
  
L'unica cosa da tener presente è che, data l'inerenza dalla classe base '''Object''', e da eventuali classi superiori, verranno chiamati prima i metodi '''_new()''' delle classi superiori, partendo da quella più in alto, fino ad arrivare alla nostra (come per l'esempio).
+
L'unica cosa da tener presente è che, data l'inerenza dalla classe base '''Object''', e da eventuali altre, verranno chiamati prima i metodi '''_new()''' delle classi superiori, partendo da quella più in alto, fino ad arrivare alla nostra (come per l'esempio).
 
Eventuali parametri, già previsti nelle classi superiori, verranno caricati prima di quelli della nostra classe.
 
Eventuali parametri, già previsti nelle classi superiori, verranno caricati prima di quelli della nostra classe.
E' da ricordare che il posizionamento dei parametri deve prevedere anche quelli delle classi superiori, e il loro posizionamento deve seguire la logica: da destra verso sinistra.
+
E' anche da ricordare che l'elenco dei parametri passati alla nostra classe deve comprendere anche quelli delle classi superiori, e il loro posizionamento deve seguire la logica: da destra verso sinistra, ovvero la prima che sarà letta e utilizzata è la prima a destra.
  
Esempio, costruiamo una classe MyButton, derivata dalla classe base '''Button''' di Gambas.
+
Come esempio, costruiamo una classe MyButton, derivata dalla classe base '''Button''' di Gambas.
  
- Tramite l'IDE di Gambas, creiamo una classe MyButton, quindi aprimo l'editor per modificarne il codice:
+
Tramite l'IDE di Gambas, creiamo una classe MyButton, quindi apriamo l'editor per modificarne il codice:
 
----
 
----
  
Riga 48: Riga 48:
  
 
----
 
----
- a questo punto, per la creazione dell'oggetto MyButton, è necessario il codice seguente:
+
A questo punto, per utilizzare l'oggetto MyButton, è necessario il codice seguente:
 
 
 
----
 
----
  
Riga 61: Riga 60:
  
 
----
 
----
Come è possibile capire dall'esempio, nella funzione "CreaMyButton()", viene definito un oggetto MyBtn di tipo MyButton (la nostra classe), e nella sua creazione vengono passati due parametri: "OK" e hForm. Il primo rappresenta l'etichetta da stampare sul pulsante, il secondo il riferimento all'oggetto contenitore (una Form). A questo punto è da notare la posizione dei due parametri, in cui nel primo posto viene passata l'etichetta, nel secondo il riferimento al contenitore; nella creazione della classe MyButton, viene dapprima creata la classe base '''Button''', a cui verrà passato il riferimento alla '''Form''', quindi verrà creata la classe derivata MyButton, a cui verrà passata l'etichetta che abbiamo definito come parametro nel metodo _new().
+
Come è possibile capire dall'esempio, nella funzione "CreaMyButton()", viene definito un oggetto MyBtn di tipo MyButton (la nostra classe), e nella sua creazione vengono passati due parametri: la stringa "OK" e hForm. Il primo rappresenta l'etichetta da stampare sul pulsante, il secondo il riferimento all'oggetto contenitore (una Form). E' da notare la posizione dei due parametri, in cui nel primo posto viene passata l'etichetta, nel secondo il riferimento al contenitore; nella creazione della classe MyButton, come prima cosa viene creata la classe base '''Button''', a cui verrà passato il riferimento alla '''Form''' (il secondo parametro), quindi verrà creata la classe derivata MyButton, a cui verrà passata l'etichetta che abbiamo definito come parametro nel metodo _new() (primo parametro).
  
In questa logica è possibile anche definire parametri opzionali ('''OPTIONAL'''), magari con valori di default che verranno impostati se non presenti nella creazione dell'oggetto:
+
Con questa logica è anche possibile definire parametri opzionali ('''OPTIONAL'''), magari con valori di default che verranno impostati se non presenti nella creazione dell'oggetto:
  
 
Esempio:
 
Esempio:

Versione delle 15:33, 25 set 2008

_new(), _free()


In Gambas, per tutti gli oggetti base, sono presenti alcuni metodi, che di norma non vengono presi in considerazione e che, in effetti, non vengono neppure dichiarati durante la costruzione di un oggetto. Dato che ogni oggetto deriva in ogni caso dalla classe base Object di Gambas, anche queste proprietà nascoste vengono definite nelle nuove sotto classi. L'utilità di questi metodi è enorme, dato che tramite queste è possibile modificare le proprietà di base dell'oggetto stesso, passare parametri, definire condizioni di funzionamento, ecc. Questa particolarità è inclusa sia nelle classi dinamiche (es. ListBox, Menu, ecc.), sia le classi statiche come, ad esempio, le Form. Per fare un esempio, la classe Form non accetta di norma alcun parametro, ma vediamo come è possibile modificare questa impostazione in modo tale, ad esempio, da potergli passare un array di stringhe:

Creiamo una Form, e apriamo l'editor di testo per modificare il codice della Form, e scriviamo le istruzioni seguenti:


 PRIVATE $arr AS String[]
 ...
 ...
 PUBLIC SUB _new( arr AS String[] )
   ...
   $arr = arr
   ...  
 END

Cosa abbiamo ottenuto? Bè, nulla di particolare... abbiamo solo detto a Gambas che la Form ora accetta un parametro, di tipo String[] !

Questa possibilità è solo permessa attraverso questo metodo nascosto, altrimenti la cosa non sarebbe stata fattibile, se non attraverso metodi poco ortodossi (come, ad esempio, delle variabili globali), e questo permette di condizionare enormemente un oggetto. Se, come da esempio, salviamo il parametro in una variabile privata della classe (nell'esempio: $arr), possiamo poi gestire i suoi dati all'interno della classe, modificarli e, magari restituirli alla chiusura della Form. Un'altra ottima caratteristica di questo metodo, è il fatto che il suddetto viene sempre e comunque invocato alla creazione della classe, prima di qualunque altro, per cui rende possibile condizionare totalmente la gestione della classe stessa; nessun evento e nessun'altra funzione sarà chiamata o attivata, se non dopo l'esecuzione del metodo _new() (il Costruttore!).

Non esistono limitazioni sulla posizione del metodo all'interno del codice ma, se presente verrà invocato.

L'unica cosa da tener presente è che, data l'inerenza dalla classe base Object, e da eventuali altre, verranno chiamati prima i metodi _new() delle classi superiori, partendo da quella più in alto, fino ad arrivare alla nostra (come per l'esempio). Eventuali parametri, già previsti nelle classi superiori, verranno caricati prima di quelli della nostra classe. E' anche da ricordare che l'elenco dei parametri passati alla nostra classe deve comprendere anche quelli delle classi superiori, e il loro posizionamento deve seguire la logica: da destra verso sinistra, ovvero la prima che sarà letta e utilizzata è la prima a destra.

Come esempio, costruiamo una classe MyButton, derivata dalla classe base Button di Gambas.

Tramite l'IDE di Gambas, creiamo una classe MyButton, quindi apriamo l'editor per modificarne il codice:


 INHERITS Button
 ...
 PUBLIC SUB _new( etichetta AS String )  'passiamo l'etichetta che verrà impostata come testo del pulsante
   ...
   WITH ME
     .Text = etichetta
   END WITH
   ...
 END

A questo punto, per utilizzare l'oggetto MyButton, è necessario il codice seguente:


 PUBLIC SUB CreaMyButton()
   ...
   DIM MyBtn AS MyButton
   ...
   MyBtn = NEW MyButton("OK", hForm)
   ...
 END

Come è possibile capire dall'esempio, nella funzione "CreaMyButton()", viene definito un oggetto MyBtn di tipo MyButton (la nostra classe), e nella sua creazione vengono passati due parametri: la stringa "OK" e hForm. Il primo rappresenta l'etichetta da stampare sul pulsante, il secondo il riferimento all'oggetto contenitore (una Form). E' da notare la posizione dei due parametri, in cui nel primo posto viene passata l'etichetta, nel secondo il riferimento al contenitore; nella creazione della classe MyButton, come prima cosa viene creata la classe base Button, a cui verrà passato il riferimento alla Form (il secondo parametro), quindi verrà creata la classe derivata MyButton, a cui verrà passata l'etichetta che abbiamo definito come parametro nel metodo _new() (primo parametro).

Con questa logica è anche possibile definire parametri opzionali (OPTIONAL), magari con valori di default che verranno impostati se non presenti nella creazione dell'oggetto:

Esempio:


 INHERITS Button
 ...
 PUBLIC SUB _new( OPTIONAL etichetta AS String = "OK" )  'se non passata, l'etichetta sarà impostata a "OK"
   ...
   WITH ME
     .Text = etichetta
   END WITH
   ...
 END