En instansegenskap, som definierats med nyckelordet function, var eller const, ärvs av alla underklasser såvida inte egenskapen deklarerats med attributet private i basklassen. Klassen Event i ActionScript 3.0 har till exempel ett antal underklasser som ärver de egenskaper som är gemensamma för alla händelseobjekt.
För vissa typer av händelser innehåller klassen Event alla egenskaper som är nödvändiga för att definiera händelsen. Dessa typer av händelser kräver inte några fler instansegenskaper än de som definierats i klassen Event. Ett exempel på sådana händelser kan vara complete som inträffar när data har lästs in samt connect som inträffar när en nätverksanslutning har upprättats.
Följande exempel är ett utdrag från klassen Event som visar några av de egenskaper och metoder som ärvs av underklasser. Eftersom egenskaperna ärvs kan en instans av valfri underklass komma åt dessa egenskaper.
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 {}
...
}
Andra typer av händelser kräver unika egenskaper som inte är tillgängliga i klassen Event. Dessa händelser definieras med hjälp av underklassen till klassen Event så att nya egenskaper kan läggas till i de egenskaper som definierats i klassen Event. Ett exempel på en sådan underklass är klassen MouseEvent som lägger till egenskaper som är unika för händelser som kopplats till musrörelser och musklickningar, till exempel händelserna mouseMove och click. Följande exempel är ett utdrag från klassen MouseEvent som visar definitionen av egenskaper som finns i underklassen men inte i basklassen:
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 {}
...
}
Åtkomstkontrollsspecifikationer och arv
Om en egenskap har deklarerats med nyckelordet public visas egenskapen för all kod. Detta betyder att nyckelordet public, i motsats till nyckelorden private, protected och internal, inte har några begränsningar för egenskapsarv.
Om en egenskap har deklarerats med nyckelordet private visas den bara i den klass som definierar den, vilket betyder att den inte ärvs av någon underklass. Detta skiljer sig från tidigare versioner av ActionScript, där nyckelordet private beter sig snarlikt nyckelordet protected i ActionScript 3.0.
Med nyckelordet protected anges att en egenskap visas i den klass som definierar den men också i alla underklasser. Med nyckelordet protected i ActionScript 3.0 visas en egenskap inte för alla andra klasser i samma paket, vilket sker med nyckelordet protected i programmeringsspråket Java. I ActionScript 3.0 kan bara underklasser komma åt en egenskap som deklarerats med nyckelordet protected. Dessutom visas en skyddad egenskap för en underklass vare sig underklassen är i samma paket som basklassen eller i ett annat paket.
Om du vill begränsa visningen av en egenskap i det paket som egenskapen är definierad i, använder du nyckelordet internal eller också använder du inte någon åtkomstkontrollsspecifikation. Åtkomstkontrollsspecifikationen internal är den standardspecifikation som tillämpas när ingen annan har angetts. En egenskap som markerats som internal ärvs bara av en underklass som finns i samma paket.
Du kan använda följande exempel för att visa hur varje åtkomstkontrollsspecifikation påverkar arv över paketgränserna. I följande kod definieras en huvudprogramklass som heter AccessControl och två andra klasser som heter Base och Extender. Klassen Base finns i paketet foo och klassen Extender, som är en underklass till Base, finns i paketet bar. Klassen AccessControl importerar bara klassen Extender och skapar en instans av Extender som försöker komma åt variabeln str som definierats i klassen Base. Variabeln str deklareras som public så att koden kompileras och körs, vilket visas i följande utdrag:
// 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
}
}
}
Om du vill visa hur de andra åtkomstkontrollsspecifikationerna påverkar kompilering och körning av föregående exempel ändrar du str-variabelns åtkomstkontrollsspecifikation till private, protected eller internal när du har tagit bort eller kommenterat ut följande rad från klassen AccessControl:
trace(myExt.str);// error if str is not public
Du kan inte åsidosätta variabler
Egenskaper som har deklarerats med nyckelorden var eller const ärvs, men kan inte åsidosättas. Att åsidosätta en egenskap är att definiera om egenskapen i en underklass. Den enda typ av egenskap som kan åsidosättas är get- och set-åtkomstfunktioner (egenskaper som deklarerats med nyckelordet function). Även om du inte kan åsidosätta en instansvariabel kan du uppnå ett liknande resultat genom att skapa get- och set-metoder för instansvariabeln och åsidosätta metoderna.