Una classe è una rappresentazione astratta di un oggetto. In una classe sono memorizzate informazioni sui tipi di dati che un oggetto può contenere e sui comportamenti in base ai quali un oggetto può funzionare. L'utilità di tale astrazione può non risultare evidente quando si creano brevi script contenenti solo pochi oggetti che interagiscono tra loro; tuttavia, con l'ampliarsi dell'area di validità di un programma e con l'aumentare del numero di oggetti da gestire, le classi consentono di controllare più accuratamente la creazione degli oggetti e il modo in cui essi interagiscono tra loro4.
Fino alla versione di ActionScript 1.0, i programmatori potevano utilizzare gli oggetti funzione per creare costrutti somiglianti a classi. Con ActionScript 2.0 è stato introdotto il supporto delle classi con parole chiave quali class ed extends. In ActionScript 3.0, non solo è previsto il supporto delle parole chiave introdotte in ActionScript 2.0, ma vengono introdotte anche nuove funzionalità, quale il controllo dell'accesso ottimizzato mediante gli attributi protected e internal e un migliore controllo dell'ereditarietà grazie all'uso delle parole chiave final e override.
Se si ha già esperienza nella creazione di classi con linguaggi di programmazione quali Java, C++ o C#, le procedure di ActionScript risulteranno familiari.
4 Nel Capitolo 4 verrà evidenziata la struttura a classi della libreria digitale. Ogni aspetto della libreria infatti, sarà tradotto logicamente con la classe opportuna. Il programma nella sua completezza risulta essere un insieme di oggetti comunicanti tra di loro.
ActionScript utilizza infatti molte parole chiave e nomi di attributo comuni a tali linguaggi di programmazione, quali class, extends e public5.
2.4.1 Definizioni delle classi
Le definizioni delle classi in ActionScript 3.0 impiegano una sintassi simile a quella utilizzata in ActionScript 2.0. La sintassi corretta per la definizione di una classe richiede la parola chiave class seguita dal nome della classe. Il corpo della classe, racchiuso tra parentesi graffe ({}), segue il nome della classe.
Ad esempio, il seguente codice consente di creare una classe denominata Shape contenente una variabile denominata visible:
public class Shape {
var visible:Boolean = true; }
Una modifica significativa della sintassi riguarda la definizione delle classi che si trovano all'interno di un pacchetto. In ActionScript 2.0, se una classe si trovava all'interno di un pacchetto, il nome del pacchetto doveva essere incluso nella dichiarazione della classe. In ActionScript 3.0, con l'introduzione dell'istruzione package, il nome del pacchetto deve essere incluso nella dichiarazione del pacchetto, anziché nella dichiarazione della classe. Ad esempio, le seguenti dichiarazioni di classe mostrano come la classe BitmapData, che fa parte del pacchetto flash.display, viene definita in ActionScript 2.0 e in ActionScript 3.0:
// ActionScript 2.0
class flash.display.BitmapData {}
5
In questo capitolo, il termine proprietà si riferisce a qualsiasi membro di una classe o di un oggetto, incluse variabili, costanti e metodi. Inoltre, anche se spesso i termini classe e statica vengono utilizzati in modo intercambiabile, in questo capitolo essi si riferiscono a concetti distinti. Ad esempio, in questo capitolo il termine proprietà di classe si riferisce a tutti i membri di una classe e non solo ai membri statici.
// ActionScript 3.0 package flash.display {
public class BitmapData {} }
2.4.2 Attributi di classe
ActionScript 3.0 consente di modificare le definizioni delle classi mediante l’impiego di uno dei seguenti attributi:
Attributo Definizione
dynamic Consente di aggiungere proprietà alle istanze in fase di runtime.
Final La classe non può essere estesa da un’altra classe.
Internal (valore predefinito) Visibile ai riferimenti che si trovano all’interno del pacchetto corrente.
Public Visibile a tutti i riferimenti.
In tutti questi casi, a eccezione di internal, è necessario includere espressamente l’attributo per ottenere il comportamento associato. Ad esempio, se durante la definizione di una classe non si include l’attributo dynamic, non sarà possibile aggiungere proprietà a un’istanza della classe in fase di run-time. Per assegnare esplicitamente un attributo è necessario collocarlo all’inizio della definizione della classe, come indicato nel codice seguente:
dynamic class Shape {}
Si tenga presente che nell’elenco non è incluso un attributo denominato abstract. Questo perché le classi abstract non sono supportate in ActionScript 3.0. Si noti inoltre che l’elenco non contiene attributi denominati private e protected. Tali attributi hanno un significato unicamente all’interno di una definizione di classe e non possono essere applicati alle classi
stesse. Per fare in modo che una classe non sia pubblicamente visibile al di fuori di un pacchetto, è necessario inserire la classe in un pacchetto e contrassegnarla con l’attributo internal. In alternativa, è possibile omettere sia l’attributo internal che l’attributo public; in tal modo il compilatore inserirà automaticamente l’attributo internal. Se si desidera che una classe non sia visibile al di fuori del file di origine che la definisce, collocate la classe alla base del file di origine, sotto la parentesi graffa che chiude la definizione del pacchetto.
2.4.3 Corpo della classe
Il corpo della classe, racchiuso tra parentesi graffe, consente di definire le variabili, le costanti e i metodi della classe. Nell'esempio seguente è riportata la dichiarazione per la classe Accessibility nell'API di Adobe Flash Player:
public final class Accessibility {
public static function get active():Boolean;
public static function updateProperties():void; }
All'interno del corpo di una classe è possibile definire anche uno spazio dei nomi. Nell'esempio seguente è illustrato come uno spazio dei nomi può essere definito all'interno del corpo di una classe e utilizzato come attributo di un metodo di tale classe:
public class SampleClass {
public namespace sampleNamespace;
sampleNamespace function doSomething():void; }
ActionScript 3.0 consente di inserire nel corpo di una classe non solo definizioni, ma anche istruzioni. Le istruzioni che si trovano all'interno del corpo di una classe, ma al di fuori della definizione di un metodo, vengono eseguite una sola
volta, vale a dire nel momento in cui la definizione della classe viene rilevata la prima volta e l'oggetto classe associato viene creato.
L'esempio seguente include una chiamata a una funzione esterna, hello(), e un'istruzione trace che consente di produrre un messaggio di conferma quando la classe viene definita:
function hello():String { trace("hola"); } class SampleClass { hello(); trace("class created"); } // output when class is created hola
class created
A differenza di quanto avveniva nelle precedenti versioni di ActionScript, in ActionScript 3.0 è consentito definire una proprietà statica e una proprietà di istanza con lo stesso nome all'interno di un medesimo corpo di classe. Ad esempio, il codice seguente indica una variabile statica denominata message e una variabile di istanza con lo stesso nome:
class StaticTest {
static var message:String = "static variable";
var message:String = "instance variable"; }
// In your script
var myST:StaticTest = new StaticTest();
trace(StaticTest.message); // output: static variable trace(myST.message); // output: instance variable