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.