Een instantie-eigenschap, of die nu met het trefwoord function, var of const is gedefinieerd, wordt overgeërfd door alle subklassen, op voorwaarde dat de eigenschap in de basisklasse niet met het attribuut private is gedefinieerd. De klasse Event in ActionScript 3.0 bevat bijvoorbeeld een aantal subklassen die eigenschappen overerven die van toepassing zijn op alle gebeurtenisobjecten.
Voor sommige gebeurtenissen bevat de klasse Event alle benodigde eigenschappen om de gebeurtenis te definiëren. Deze gebeurtenissen vereisen naast de gedefinieerde instantie-eigenschappen in de klasse Event geen aanvullende instantie-eigenschappen. Voorbeelden van dergelijke gebeurtenissen zijn de gebeurtenis complete, die optreedt wanneer gegevens zijn geladen, en de gebeurtenis connect, die optreedt wanneer een netwerkverbinding tot stand is gebracht.
Het volgende voorbeeld is een fragment uit de klasse Event die enkele van de eigenschappen en methoden toont die door subklassen worden overgeërfd. Omdat de eigenschappen worden overgeërfd, heeft een instantie van een subklasse toegang tot deze eigenschappen.
public class Event
{
public function get type():String;
public function get bubbles():Boolean;
...
public function stopPropagation():void {}
public function stopImmediatePropagation():void {}
public function preventDefault():void {}
public function isDefaultPrevented():Boolean {}
...
}
Overige typen gebeurtenissen vereisen unieke eigenschappen die niet beschikbaar zijn in klasse Event. Deze gebeurtenissen worden gedefinieerd met gebruik van de subklassen van de klasse Event zodat nieuwe eigenschappen aan de eigenschappen kunnen worden toegevoegd die in de klasse Event zijn gedefinieerd. Een voorbeeld van een dergelijke subklasse is de klasse MouseEvent; deze klasse voegt eigenschappen toe die uniek zijn voor gebeurtenissen die zijn gekoppeld aan muisbewegingen of muisklikken, zoals de gebeurtenissen mouseMove en click. Het volgende voorbeeld is een fragment van de klasse MouseEvent die de definitie van eigenschappen toont die bestaat in de subklasse, maar niet in de basisklasse:
public class MouseEvent extends Event
{
public static const CLICK:String= "click";
public static const MOUSE_MOVE:String = "mouseMove";
...
public function get stageX():Number {}
public function get stageY():Number {}
...
}
Toegangsbeheerspecificaties en overerving
Als een eigenschap is gedeclareerd met het trefwoord public, is de eigenschap zichtbaar voor alle code. Dit houdt in dat het trefwoord public, in tegenstelling tot de trefwoorden private, protected en internal, geen beperkingen oplevert voor het overerven van eigenschappen.
Als een eigenschap is gedeclareerd met het trefwoord private, is deze alleen zichtbaar in de klasse die de eigenschap definieert; de eigenschap kan dus niet door subklassen worden overgeërfd. Dit gedrag verschilt met vorige versies van ActionScript, waar het trefwoord private zich meer als het trefwoord protected van ActionScript 3.0 gedroeg.
Het trefwoord protected geeft aan dat een eigenschap niet alleen zichtbaar is binnen de klasse die de eigenschap heeft gedefinieerd, maar ook voor alle subklassen. In tegenstelling tot het trefwoord protected in de Java-programmeertaal, maakt het trefwoord protected in ActionScript 3.0 een eigenschap niet zichtbaar voor alle andere klassen in hetzelfde pakket. In ActionScript 3.0 hebben alleen subklassen toegang tot een eigenschap die is gedeclareerd met het trefwoord protected. Bovendien is een beschermde eigenschap zichtbaar voor een subklasse, ongeacht of de subklasse zich in hetzelfde pakket als de basisklasse bevindt of in een ander pakket.
Als u de zichtbaarheid van een eigenschap wilt beperken voor het pakket waarin deze is gedefinieerd, gebruikt u het trefwoord internal of maakt u geen gebruik van een toegangsbeheerspecificatie. De toegangsbeheerspecificatie internal is de toegangsbeheerspecificatie die standaard wordt gebruikt wanneer er geen is opgegeven. Een eigenschap die is gemarkeerd als internal, wordt alleen door een subklasse overgeërfd die zich in hetzelfde pakket bevindt.
U kunt aan de hand van het volgende voorbeeld zien hoe elk van de toegangsbeheerspecificaties pakketgrensoverschrijdende overerving beïnvloedt. De volgende code definieert een hoofdtoepassingsklasse met de naam AccessControl en twee andere klassen met de naam Base en Extender. De klasse Base bevindt zich in een pakket met de naam foo en de klasse Extender, een subklasse van de klasse Base, bevindt zich in een pakket met de naam bar. De klasse AccessControl importeert alleen de klasse Extender en maakt een instantie van Extender die toegang probeert te krijgen tot een variabele met de naam str, die in de klasse Base is gedefinieerd. De variabele str is gedeclareerd als public, zodat de code wordt gecompileerd en uitgevoerd zoals getoond in het volgende fragment:
// Base.as in a folder named foo
package foo
{
public class Base
{
public var str:String = "hello"; // change public on this line
}
}
// Extender.as in a folder named bar
package bar
{
import foo.Base;
public class Extender extends Base
{
public function getString():String {
return str;
}
}
}
// main application class in file named AccessControl.as
package
{
import flash.display.MovieClip;
import bar.Extender;
public class AccessControl extends MovieClip
{
public function AccessControl()
{
var myExt:Extender = new Extender();
trace(myExt.str);// error if str is not public
trace(myExt.getString()); // error if str is private or internal
}
}
}
Als u het effect van de overige toegangsbeheerspecificaties wilt zien op de compilatie en uitvoering van het vorige voorbeeld, wijzigt u de toegangsbeheerspecificatie van de variabele str in private, protected of internal nadat u de volgende regel uit de klasse AccessControl hebt verwijderd of genegeerd:
trace(myExt.str);// error if str is not public
Variabelen overschrijven niet toegestaan
Eigenschappen die zijn gedeclareerd met de trefwoorden var of const, worden overgeërfd, maar kunnen niet worden overschreven. Als u een eigenschap wilt overschrijven, moet de eigenschap in een subklasse opnieuw worden gedefinieerd. De enige type eigenschap die u kunt overschrijven, zijn get/set-methoden, oftewel eigenschappen die zijn gedeclareerd met het trefwoord function). Hoewel u een instantievariabele niet kunt overschrijven, kunt u een vergelijkbare functionaliteit verkrijgen door methoden getter en setter te maken voor de instantievariabele en de methoden te overschrijven.