Classi dinamiche

Una classe dinamica definisce un oggetto che può essere alterato in fase di runtime aggiungendo o modificandone le proprietà e i metodi. Un classe non dinamica, ad esempio la classe String, si definisce chiusa (sealed in inglese). Non è possibile aggiungere proprietà o metodi a una classe chiusa in runtime.

Per creare una classe dinamica si utilizza l'attributo dynamic nella relativa dichiarazione. Ad esempio, il codice seguente crea una classe dinamica denominata Protean:

dynamic class Protean
{
    private var privateGreeting:String = "hi";
    public var publicGreeting:String = "hello";
    function Protean()
    {
        trace("Protean instance created");
    }
}

Se successivamente si crea un'istanza della classe Protean, è possibile aggiungervi proprietà o metodi esternamente alla definizione della classe. Ad esempio, il codice seguente crea un'istanza della classe Protean e vi aggiunge due proprietà denominate rispettivamente aString e aNumber:

var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
trace(myProtean.aString, myProtean.aNumber); // testing 3

Le proprietà aggiunte a un'istanza di una classe dinamica sono entità runtime, quindi le verifiche di qualsiasi tipo vengono eseguite in fase di runtime. Non è possibile aggiungere un'annotazione di tipo a una proprietà creata in questo modo.

È anche possibile aggiungere un metodo all'istanza myProtean definendo una funzione e associandola a una proprietà dell'istanza myProtean. Il codice seguente sposta l'istruzione trace in un metodo denominato traceProtean():

var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
myProtean.traceProtean = function ()
{
    trace(this.aString, this.aNumber);
};
myProtean.traceProtean(); // testing 3

I metodi creati in questo modo, tuttavia, non hanno accesso a eventuali proprietà o metodi privati della classe Protean. Inoltre, anche i riferimenti a proprietà o metodi pubblici della classe Protean devono essere qualificati con la parola chiave this o con il nome della classe. Nell'esempio seguente, il metodo traceProtean() tenta di accedere alle variabili private e pubbliche della classe Protean.

myProtean.traceProtean = function ()
{
    trace(myProtean.privateGreeting); // undefined
    trace(myProtean.publicGreeting); // hello
};
myProtean.traceProtean();

Flash CS3

 

Inviami un messaggio e-mail quando vengono aggiunti dei commenti a questa | Rapporto sui commenti

Pagina corrente: http://livedocs.adobe.com/flash/9.0_it/main/00000046.html