Attributi dei metodi di una classe Actionscript 3.0
Abbiamo visto nella
lezione 4 di OOP con Flash CS3
i tipi di attributi che possiamo associare ad una proprietà, come dichiararli e le differenze tra uno e l' altro.
Per quanto riguarda i metodi ed i loro attributi, sono identici a quelli delle proprietà ed hanno le stesse caratteristiche.
Una cosa molto importante è la seguente:
supponiamo di avere una classe che ha una proprietà che si chiama
nome.
Se la classe deve svolgere un determinato compito e perchè funzioni necessitiamo che la sua proprietà
nome non venga alterata ( altrimenti cambierebbe l' esito ) allora sappiamo che rendendo quella proprietà private abbiamo la certezza che chiunque utilizzi la nostra classe non possa accedere a quella proprietà da una sua istanza.
Ma rendendola private, non è accessibile neanche per la lettura e forse la logica dell' applicazione che stiamo sviluppando oppure chi sta utilizzando la nostra classe necessita di recuperare almeno il valore di quella proprietà.
Per renderla accessibile senza cambiare il suo attributo private possiamo creare un metodo public ( es:
prendiNome ) che una volta chiamato restituisce il valore della proprietà
nome. Come ? Dato che il metodo si trova all' interno della classe ( è appunto un metodo della stessa classe ) ha accesso alla proprietà
nome.
Vediamo bene di cosa si tratta con degli esempi concreti...
Creo un FLA che chiamo ' quinta.fla '.
La Document Class che chiamo ' Quinta.as ' :
Code:
package
{
import flash.display.MovieClip;
public class Quinta extends MovieClip
{
private var elenco:Elenco;
public function Quinta()
{
}
}
}
La Document Class ha una proprietà di tipo Elenco, cioè una variabile di tipo Elenco o una istanza di Elenco ( chiamatela come vi pare ).
Elenco.as è la seguente classe:
Code:
package
{
public class Elenco
{
private var nome:String='Miles';
public function Elenco()
{
}
}
}
ha una proprietà private che si chiama nome e che contiene un valore stringa.
Adesso istanziamo la classe Elenco:
Code:
package
{
import flash.display.MovieClip;
public class Quinta extends MovieClip
{
private var elenco:Elenco;
public function Quinta()
{
elenco=new Elenco();
}
}
}
ora se provassi a recuperare il valore di nome di Elenco in questo modo:
trace(elenco.nome);
Flash mi punirebbe giustamente con questo errore:
1178: Attempted access of inaccessible property nome through a reference with static type Elenco.
Fin quì niente di nuovo, tutte cose che abbiamo già visto nella lezione 4.
Ma se avessi un effetivo bisogno di recuperare quel valore, dovrei per forza rendere public la proprietà nome di Elenco ?
La risposta è no, potrei implementare un metodo nella classe Elenco, in questo modo:
Code:
package
{
public class Elenco
{
private var nome:String='Miles';
public function Elenco()
{
}
public function prendiNome():String
{
return nome;
}
}
}
chiamando il metodo prendiNome, posso recuperare il valore di nome. Il metodo è public e la proprietà e private, per cui è il metodo che recupera il valore:
Code:
package
{
import flash.display.MovieClip;
public class Quinta extends MovieClip
{
private var elenco:Elenco;
public function Quinta()
{
elenco=new Elenco();
trace(elenco.prendiNome());
}
}
}
infatti ottengo il seguente output:
Miles
In questo caso, nome di Elenco non è accessibile e quindi non modificabile ma è leggibile appunto tramite chiamata del metodo prendiNome.
Sostanzialmente abbiamo incapsulato la proprietà nome di Elenco.
Esiste un altro modo e sono i metodi getter & setter che vedremo nella prossima lezione.
Metodi statici
Come le proprietà, anche i metodi possono avere attributo static e sia l' uso che il funzionamento è identico a quello delle proprietà.
Vediamo un esempio:
Code:
package
{
public class Elenco
{
private var nome:String='Miles';
public function Elenco()
{
}
public function prendiNome():String
{
return nome;
}
public static function provaStatico():void
{
trace('il metodo statico ProvaStatico è stato chiamato correttamente');
}
}
}
ho aggiunto un metodo statico e pubblico alla classe Elenco.
Adesso chiamo il metodo dalla Document Class:
Code:
package
{
import flash.display.MovieClip;
public class Quinta extends MovieClip
{
private var elenco:Elenco;
public function Quinta()
{
elenco=new Elenco();
trace(elenco.prendiNome());
Elenco.provaStatico();
}
}
}
chiaramente non lo chiamo dalla istanza elenco, ma lo chiamo direttamente ( come abbiamo già visto con le proprietà ) :
Elenco.provaStatico();
e ottengo questo output:
Miles
il metodo statico ProvaStatico è stato chiamato correttamente
Accessibilità a proprietà non statiche da metodi statici o viceversa
Se adesso volessi accedere a nome di Elenco dal metodo statico provaStatico ?
Proviamo:
Code:
package
{
public class Elenco
{
private var nome:String='Miles';
public function Elenco()
{
}
public function prendiNome():String
{
return nome;
}
public static function provaStatico():void
{
trace('il metodo statico ProvaStatico è stato chiamato correttamente');
trace(nome);
}
}
}
Mantenendo sempre la chiamata dalla Document Class Elenco.provaStatico(); Flash mi restituisce questo errore:
1120: Access of undefined property nome.
Questo significa che metodi statici non possono accedere a proprietà non statiche. Addirittura Flash dice che la proprietà nome non è stata definita.
Vediamo il contrario, un metodo non statico che prova ad accedere una proprietà statica.
La classe Elenco diventa così:
Code:
package
{
public class Elenco
{
private static var nome:String='Miles';
public function Elenco()
{
}
public function provaNonStatico():void
{
trace('il metodo statico ProvaStatico è stato chiamato correttamente');
trace(nome);
}
}
}
ho reso statica la proprietà nome e non statico il metodo provaNonStatico.
Eseguo la chiamata dalla Document Class:
Code:
package
{
import flash.display.MovieClip;
public class Quinta extends MovieClip
{
private var elenco:Elenco;
public function Quinta()
{
elenco=new Elenco();
elenco.provaNonStatico();
}
}
}
elenco.provaNonStatico(); è una chiamata appunto dell' evento provaNonStatico dall' istanza della classe Elenco ( elenco ) che è nella Document Class ( anche questo già visto con la lezione sulle proprietà ):
Ottengo il seguente output:
il metodo statico ProvaStatico è stato chiamato correttamente
Miles
Quindi, ricapitolando:
- un metodo statico non può accedere ad una proprietà non statica
- un metodo non statico può accedere ad una proprietà statica
Allego i files: