Uma propriedade da ocorrência, se definida com as palavras-chave
function
,
var
ou
const
, será herdada por todas as subclasses desde que a propriedade não seja declarada com o atributo
private
na classe base. Por exemplo, a classe Event no ActionScript 3.0 tem várias subclasses que herdam propriedades comuns a todos os objetos de eventos.
Para alguns tipos de eventos, a classe Event contém todas as propriedades necessárias para definir o evento. Esses tipos de eventos não exigem propriedades da ocorrência além daquelas definidas na classe Event. Exemplos desses eventos são o evento
complete
, que ocorre quando os dados foram carregados com êxito, e o evento
connect
, que ocorre quando uma conexão de rede foi estabelecida.
O exemplo a seguir é um fragmento da classe Event que mostra algumas das propriedades e métodos herdados por subclasses. Como as propriedades são herdadas, uma ocorrência de qualquer subclasse pode acessar essas propriedades.
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 {}
...
}
Outros tipos de eventos exigem propriedades exclusivas não estão disponíveis na classe Event. Esses eventos são definidos usando subclasses da classe Event para que novas propriedades possam ser adicionadas às propriedades definidas na classe Event. Um exemplo dessa subclasse é a classe MouseEvent, que adiciona propriedades exclusivas a eventos associados a movimento ou a cliques do mouse, como os eventos
mouseMove
e
click
. O exemplo a seguir é um fragmento da classe MouseEvent que mostra a definição de propriedades que existem na subclasse, mas não na classe base:
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 {}
...
}
Especificadores de controle de acesso e herança
Se uma propriedade for declarada com a palavra-chave
public
, ela será visível ao código em qualquer lugar. Isso significa que a palavra-chave
public
, ao contrário das palavras-chave
private
,
protected
e
internal
, não coloca nenhuma restrição sobre a herança da propriedade.
Se uma propriedade for declarada com a palavra-chave
private
, ela será visível apenas na classe que a define, o que significa que não será herdada por nenhuma subclasse. Esse comportamento é diferente nas versões anteriores do ActionScript, em que a palavra-chave
private
se comportava de maneira mais semelhante à palavra-chave
protected
do ActionScript 3.0.
A palavra-chave
protected
indica que uma propriedade é visível não apenas dentro da classe que a define, mas também a todas as subclasses. Ao contrário da palavra-chave
protected
na linguagem de programação Java, a palavra-chave
protected
no ActionScript 3.0 não torna a propriedade visível para todas as outras classes no mesmo pacote. No ActionScript 3.0, apenas as subclasses podem acessar uma propriedade declarada com a palavra-chave
protected
. Além disso, uma propriedade protegida será visível para uma subclasse, se a subclasse estiver no mesmo pacote da classe base ou em um pacote diferente.
Para limitar a visibilidade de uma propriedade para o pacote no qual ela está definida, use a palavra-chave
internal
ou não use nenhum especificador de controle de acesso. O especificador de controle de acesso
internal
é o especificador padrão aplicado quando um não está especificado. Uma propriedade marcada como
internal
só é herdada por uma subclasse que reside no mesmo pacote.
Você pode usar o exemplo a seguir para ver como cada um dos especificadores de controle de acesso afeta a herança entre limites de pacotes. O código a seguir define uma classe de aplicativo principal denominada AccessControl e duas outras classes denominadas Base e Extender. A classe Base está em um pacote denominado foo e a classe Extender, que é uma subclasse da classe Base, está em um pacote denominado bar. A classe AccessControl importa apenas a classe Extender e cria uma ocorrência de Extender que tenta acessar uma variável denominada
str
definida na classe Base. A variável
str
é declarada como
public
para que o código seja compilado e executado, conforme mostrado no seguinte trecho:
// 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
}
}
}
Para ver como os outros especificadores de controle de acesso afetam a compilação e a execução do exemplo anterior, altere o especificador de controle de acesso da variável
str
para
private
,
protected
ou
internal
após excluir ou comentar a linha seguinte da classe
AccessControl
:
trace(myExt.str);// error if str is not public
Substituição de variáveis não permitidas
As propriedades declaradas com as palavras-chave
var
ou
const
são herdadas, mas não podem ser substituídas. Substituir uma propriedade significa redefini-la em uma subclasse. O único tipo de propriedade que pode ser substituído são os acessadores get e set (propriedades declaradas com a palavra-chave
function
). Embora não seja possível substituir uma variável de ocorrência, você pode alcançar funcionalidade semelhante criando os métodos getter e setter para a variável de ocorrência e substituindo os métodos.