• Non ci sono risultati.

Attributi delle proprietà di classe………………………………………………….6 6

In relazione al modello a oggetti di ActionScript, il termine proprietà si riferisce a un qualsiasi membro di un una classe, incluse variabili, costanti e metodi. Nella Guida di riferimento del linguaggio e dei componenti ActionScript 3.0 il termine viene invece utilizzato in senso più ristretto per indicare unicamente membri di classi corrispondenti a variabili o definiti mediante il metodo getter o setter. In ActionScript 3.0 è disponibile una serie di attributi utilizzabili con qualsiasi proprietà di classe. La tabella seguente ( Tabella 1 ) riporta tali attributi.

Attributo Definizione

internal

(valore predefinito) Visibile ai riferimenti che si trovano all'interno dello stesso pacchetto.

private Visibile ai riferimenti che si trovano all'interno della stessa classe.

protected Visibile ai riferimenti che si trovano all'interno della stessa classe e delle classi derivate.

public Visibile a tutti i riferimenti.

static Specifica che una proprietà appartiene alla classe e non alle sue istanze.

UserDefinedNamespace Nome dello spazio dei nomi personalizzato definito

dall'utente.

Tabella 1 - Attributi della proprietà classe

2.5.1 Attributi dello spazio dei nomi per il controllo dell’accesso

ActionScript 3.0 prevede quattro attributi speciali che controllano l’accesso alle proprietà definite all’interno di una classe: public, private, protected e internal.

L’attributo public6 rende una proprietà visibile in qualsiasi punto dello script. Ad

6 Come si potrà notare nel Capitolo 5, studiando il codice di implementazione della libreria digitale, si è cercato di attenersi il più possibile all’incapsulamento dei dati, per cui la maggior parte delle proprietà di ogni singola classe risulta essere private e l’accesso a tali proprietà è

esempio, per rendere un metodo disponibile al codice che si trova al di fuori del pacchetto, è necessario dichiarare il metodo con l’attributo public. Ciò vale per qualsiasi proprietà che sia stata dichiarata utilizzando le parole chiave var,const o function.

L’attributo private rende una proprietà visibile unicamente ai chiamanti entro la classe che definisce le proprietà. Tale comportamento si differenzia da quello dell’attributo private di ActionScript 2.0, che consentiva a una sottoclasse di accedere a una proprietà privata di una superclasse. Un’altra significativa modifica nel comportamento ha a che fare con l’accesso in fase di runtime. In ActionScript 2.0 la parola chiave private impediva l’accesso solo in fase di compilazione e poteva essere facilmente evitata in fase di runtime. In ActionScript 3.0 ciò non è più possibile. Le proprietà contrassegnate come private non risultano disponibili né in fase di compilazione né in fase di runtime.

Ad esempio, il codice seguente crea una semplice classe denominata PrivateExample con una variabile private, quindi tenta di accedere alla variabile privata dall’esterno della classe. In ActionScript 2.0, l’accesso in fase di compilazione non era consentito, ma tale divieto veniva facilmente aggirato mediante l’impiego dell’operatore di accesso alle proprietà ([]), che esegue una ricerca delle proprietà in fase di runtime, anziché in fase di compilazione.

Solo in fase di compilazione e poteva essere facilmente evitata in fase di runtime. In ActionScript 3.0 ciò non è più possibile. Le proprietà contrassegnate come private non risultano disponibili né in fase di compilazione né in fase di runtime.

Class PrivateExample {

private var privVar:String = “private variable”; }

var myExample:PrivateExample = new PrivateExample();

trace(myExample.privVar);// compile-time error in strict mode

trace(myExample[“privVar”]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this is a run-time error.

In ActionScript 3.0, il tentativo di accedere a una proprietà privata mediante l’operatore punto (myExample.privVar) provoca un errore di compilazione, se ci si trova in modalità rigorosa. In caso contrario, l’errore viene riportato in fase di run-time, esattamente come accade quando si usa l’operatore di accesso alle proprietà (myExample[“privVar”]).

Nella tabella seguente sono riportati i risultati dei tentativi di accesso a una proprietà privata appartenente a una classe chiusa (non dinamica):

Modalità rigorosa Modalità standard

operatore punto (.) errore di compilazione errore di runtime operatore parentesi ([]) errore di runtime errore di runtime

Nelle classi dichiarate con l’attributo dynamic, i tentativi di accesso a una variabile privata non provocano errori di runtime. Al contrario, la variabile risulta semplicemente invisibile, di conseguenza Flash Player o Adobe® AIR™ restituiscono il valore undefined. Un errore in fase di compilazione si verifica invece se si utilizza un operatore punto in modalità rigorosa. L’esempio seguente è uguale a quello precedente, con la sola differenza che la classe PrivateExample viene dichiarata come classe dinamica:

dynamic class PrivateExample {

private var privVar:String = “private variable”; }

var myExample:PrivateExample = new PrivateExample();

trace(myExample.privVar);// compile-time error in strict mode trace(myExample[“privVar”]); // output: undefined

Le classi dinamiche restituiscono in genere il valore undefined, anziché generare un errore, se un codice esterno alla classe tenta di accedere a una proprietà privata. Nella tabella seguente si evidenzia che l’errore viene generato unicamente se si utilizza l’operatore punto per accedere a una proprietà privata in modalità rigorosa:

Modalità rigorosa Modalità standard

operatore punto (.) errore di compilazione undefined

operatore parentesi ([]) undefined undefined

L’attributo protected, nuovo in ActionScript 3.0, rende una proprietà visibile ai chiamanti della sua stessa classe o di una sottoclasse. In altre parole, una proprietà protetta è disponibile solo all’interno della propria classe o delle classi che si trovano sotto di essa nella gerarchia di ereditarietà. Ciò vale sia che la sottoclasse si trovi nello stesso pacchetto o in un pacchetto differente.

Questa funzionalità è analoga all’attributo private di ActionScript 2.0. Anche l’attributo protected di ActionScript 3.0 è simile all’attributo Java protected ma, a differenza della versione Java, consente l’accesso anche ai chiamanti all’interno dello stesso pacchetto. L’attributo protected è utile se si dispone di una variabile o di un metodo necessario alle sottoclassi, ma che si desidera tenere nascosto da codice esterno alla catena di ereditarietà.

L’attributo internal, nuovo in ActionScript 3.0, rende una proprietà visibile ai chiamanti che si trovano all’interno del suo stesso pacchetto. Si tratta dell’attributo predefinito del codice all’interno di un pacchetto e può essere applicato a qualsiasi proprietà che non presenta alcuno dei seguenti attributi:

• public • private • protected

L’attributo internal è simile al controllo dell’accesso predefinito in Java, anche se in Java non esiste un nome esplicito per tale livello di accesso, che può essere ottenuto solo mediante l’omissione di un qualsiasi altro modificatore dell’accesso. L’attributo internal di ActionScript 3.0 consente all’utente di dimostrare esplicitamente l’intenzione di rendere una proprietà visibile unicamente ai chiamanti che si trovano all’interno del suo stesso pacchetto.

2.5.2 Attributo static

L'attributo static, utilizzabile con proprietà dichiarate con le parole chiave var, const o function, consente di associare una proprietà alla classe anziché a istanze della classe7. Il codice esterno alla classe deve chiamare proprietà statiche utilizzando il nome della classe anziché il nome di un'istanza. Le proprietà statiche non vengono ereditate dalle sottoclassi, ma fanno parte della catena delle aree di validità di una sottoclasse. In altre parole, all'interno del corpo di una sottoclasse, è possibile utilizzare una variabile o un metodo senza fare riferimento alla classe in cui sono stati creati.

2.5.3 Attributi spazio dei nomi definiti dall'utente

In alternativa agli attributi di controllo dell'accesso predefiniti, è possibile creare uno spazio dei nomi personalizzato da utilizzare come attributo. Per definizione è possibile utilizzare un solo attributo spazio dei nomi e non è possibile utilizzare tale attributo in combinazione con un qualsiasi attributo di controllo dell'accesso (public, private, protected, internal)