Saltar para o conteúdo

ActionScript/Encapsulamento

Origem: Wikilivros, livros abertos por um mundo aberto.

O encapsulamento numa classe é útil quando queremos que atributos de uma classe ancestral sejam privados, ou seja, não podem ser acessados pela classe herdeira, mas podem ser manipulados por métodos especiais.

Para tal, precisamos utilizar palavras reservadas get e set, em funções especiais, e super, para evocar o método construtor de uma superclasse.

  • Exemplo: vamos supor que a superclasse é Mamifero (Mamifero.as, sem acento).
package 
{
  public class Mamifero 
  {
    private var _nome:String = new String();
    private var _idade:int = new int();

    public function Mamifero(nome:String,idade:int):void 
    {
        _nome = nome;
        _idade = idade;
    }

    public function get retornaNome():String
    {
        return _nome;
    }

    public function get retornaIdade():int
    {
        return _idade;
    }

    public function set mudeNome(novoNome:String):void 
    {
        _nome = novoNome;
    }

    public function set mudeIdade(novaIdade:String):void 
    {
        _nome = novaIdade;
    }
  }
}

Os métodos set (do inglês "ajustar") servem para uma subclasse (classe herdeira) atualizar os valores de uma superclasse (papel que será desempenhada por Mamifero). Já métodos get ("obter") retornam os atributos e são úteis quando queremos obter os valores destes atributos. Veremos agora como evocar o método construtor de Mamífero na subclasse herdeira Homem (Homem.as):

package 
{
    public class Homem extends Mamifero 
    {
        public function Homem(HHnome:String,HHidade:int):void 
        {
            super(HHnome, HHidade);
        }
    }
}

Explicação: super faz com que, quando Homem receber os seus valores (quando será instanciada) ele irá evocar o método construtor de Mamifero, sua superclasse. Agora, vamos exibir os dados. Num pacote, instanciamso Homem, inserimos valores e através de obj.retornaNome (que é um método get, apesar de não ter os () ) obtemos o valor originalmente private de nome.

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;

    public class Main extends Sprite 
    {
        public var caixaTexto:TextField = new TextField();

        public function Main():void 
        {
            var obj:Homem = new Homem("Francisco", 22);

            caixaTexto.width = 200;
            caixaTexto.text = obj.retornaNome;

            addChild(caixaTexto);
        }
    }
}