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 :

Accesso a una proprietà non definita attributo mediante un riferimento con tipo statico MiaClasseSealed.


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.