En förekomstegenskap, 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 förekomstegenskaper ä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 förekomst 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 förekomst 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 förekomstvariabel kan du uppnå ett liknande resultat genom att skapa get- och set-metoder för förekomstvariabeln och åsidosätta metoderna.