19. Classi Dinamiche e Finali
Classi Dinamiche
Con ActionScript 3 viene introdotto un nuovo concetto applicabile alle nostre classi, che potranno essere sigillate (sealed) oppure dinamiche (dynamic).
Il valore predefinito per tutte le classi è sealed, indicando al compilatore che la classe in esame è sigillata, ossia non vi sarà la possibilità di aggiungere attributi e metodi alla classe in fase di run-time.
Dichiarando invece una classe mediante la direttiva dynamic, avremo la possibilità di aggiungere dei membri ad essa anche al di fuori della sua dichiarazione o in un altro file ActionScript.
Classe Sealed
package
{
public class MiaClasseSealed
{ }
}Classe Dynamic
package
{
dynamic public class MiaClasseDynamic
{ }
}Come potete notare dal codice soprastante, non è necessaria alcuna direttiva per dichiarare una classe come sealed, al contrario per dichiararla dinamica ho anteposto alla dichiarazione della classe il comando dynamic.
Di seguito la classe documento HelloWorld che dichiara ed utilizza due istanze delle classi sopra dichiarate :
package
{
import MiaClasseSealed;
import MiaClasseDynamic;
public class HelloWorld extends MovieClip
{
public function HelloWorld():void
{
var mySealed:MiaClasseSealed = new MiaClasseSealed();
var myDynamic:MiaClasseDynamic = new MiaClasseDynamic();
mySealed.attributo = 10; // Errore
myDynamic.attributo = 10; // Tutto OK!
}
}
}L'istruzione "mySealed.attributo = 10;"
genera il seguente errore poichè la classe è sigillata e non
ammette attributi o metodi che non siano stati esplicitamente dichiarati nel corpo della classe :
|
Classi Finali
Abbiamo già dato un'occhiata alle classi finali nel capitolo Costanti ed Enumerazioni, dichiarando quest'ultime come classi finali, a causa del mancato supporto esplicito in ActionScript 3 per questo tipo di costrutti.
Dichiarando una classe come finale, diciamo al compilatore che nessuna classe può ereditare da essa, provocando quindi un errore in fase di compilazione qualora si tentasse di creare un'istanza di una classe che eredita da una classe finale.
Classe base finale
package
{
public final class ClasseFinale
{
// Corpo della classe
}
}Classe derivata
package
{
import ClasseFinale;
public class Oggetto extends ClasseFinale
{
public function Oggetto():void
{
trace("Costruttore");
}
}
}Provando a creare un'istanza della classe Oggetto otterrete il seguente errore :
La classe base è final.
- Linguaggi:
- Tags:
