La volta scorsa (
lezione 5 ) abbiamo visto come utilizzare gli attributi con i metodi di una classe Actionscript 3.0 .
Abbiamo inoltre visto come ' incapsulare ' una proprietà utilizzando un metodo che una volta chiamato restituisce il valore di tale proprietà.
Un' altro modo per poter incapsulare una proprietà con Actionscript 3.0 sono i cosìdetti metodi setter & getter.
Avevo già accennato a loro in un articolo:
getter & setter ed ora andiamo ad approfondire il discorso.
Seguitemi...
Creo il solito FLA che salvo con nome ' sesta.as '.
Gli associo la seguente Document Class ( Sesta.as ) :
Code:
package
{
import flash.display.MovieClip;
public class Sesta extends MovieClip
{
public function Sesta()
{
}
}
}
Ora creo un' altra classe ( Miles.as ) :
Code:
package
{
public class Miles
{
public function Miles()
{
}
}
}
e gli assegno una proprietà di tipo Number che si chiama _prova e gli assegno un valore pari a 100 :
Code:
package
{
public class Miles
{
private var _prova:Number=100;
public function Miles()
{
trace('la classe Miles è stata istanziata correttamente');
}
}
}
utilizzo l' underscore prima del nome perchè è buona norma utilizzarlo in una proprietà che è incapsulata da metodi getter & setter ( che stiamo per vedere ).
Istanzio la classe Miles da Sesta:
Code:
package
{
import flash.display.MovieClip;
public class Sesta extends MovieClip
{
private var miles:Miles;
public function Sesta()
{
miles=new Miles();
}
}
}
chiaramente ottengo questo output: la classe Miles è stata istanziata correttamente
Fino a quì niente di nuovo.
Abbiamo visto nella lezione 5 come creare un metodo che restituisca il valore della variabile _prova senza dover rendere pubblica la stessa variabile.
Con i metodi getter & setter, posso fare in questo modo:
Code:
package
{
public class Miles
{
private var _prova:Number=100;
public function Miles()
{
trace('la classe Miles è stata istanziata correttamente');
}
public function get prova():Number
{
return _prova;
}
}
}
public function definisco il metodo pubblico
get serve per dire a Flash di accedere al valore delle proprietà _prova
prova è il nome del metodo ( potrebbe anche avere nome pinco o pallino ma è sembre buono assegnare al get un nome uguale alla proprietà che incapsuliamo senza l' underscore )
:Number sigifica che resituisce un numero ( appunto perchè _prova è di tipo Number )
Chiamo prova da Sesta.as :
Code:
package
{
import flash.display.MovieClip;
public class Sesta extends MovieClip
{
private var miles:Miles;
public function Sesta()
{
miles=new Miles();
trace(miles.prova);
}
}
}
DA NOTARE: miles.prova
Non ho chiamato miles.prova() come fosse una chiamata normalissima ad un metodo, ma la chiamata è miles.prova. Sembra che Miles.as abbia una proprietà che si chiama prova ma non è vero. E' il get che fa tutto questo.
Adesso la proprietà _prova di Miles è incapsulata ed è solo leggibile, infatti se provassi a cambiare il suo valore:
Code:
package
{
import flash.display.MovieClip;
public class Sesta extends MovieClip
{
private var miles:Miles;
public function Sesta()
{
miles=new Miles();
trace(miles.prova);
miles.prova=200;
}
}
}
Flash mi avviserebbe con il seguente errore:
1059: Property is read-only.
La proprietà è solo leggibile.
Se volessimo permettere di accedere anche in fase di scrittura alla proprietà _prova di Miles, dovremmo aggiungere un setter in questo modo:
Code:
package
{
public class Miles
{
private var _prova:Number=100;
public function Miles()
{
trace('la classe Miles è stata istanziata correttamente');
}
public function get prova():Number
{
return _prova;
}
public function set prova(n:Number):void
{
_prova=n;
}
}
}
public function definisco il metodo pubblico
set serve per far capire a Flash che deve cambiare un valore di una proprietà
prova è il nome del metodo ( deve essere uguale al nome del setter )
(n:Number) il metodo vuole un paramero di tipo Number ( chiaramente stesso tipo della variabile che incapsuliamo )
:void che non resituisce alcun valore
e cambiamo il valore di _prova nel seguente modo:
Code:
package
{
import flash.display.MovieClip;
public class Sesta extends MovieClip
{
private var miles:Miles;
public function Sesta()
{
miles=new Miles();
trace(miles.prova);
miles.prova=200;
trace(miles.prova);
}
}
}
miles.prova=200; anche in questo caso ( come nel setter ) viene chiamato il metodo set prova come fosse una proprietà ed otteniamo questo output:
la classe Miles è stata istanziata correttamente
100
200
Allego i files: