Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Elektra

[AS3] Novos operadores 'is' e 'as'

Recommended Posts

O operador is

 

O operador is, que é novo no ActionScript 3.0, permite testar se uma variável ou expressão é um membro de um determinado tipo de dados. Nas versões anteriores do ActionScript, o operador instanceof fornecia essa funcionalidade, mas, no ActionScript 3.0, o operador instanceof não deve ser usado para testar a associação de tipo de dados. O operador is deve ser usado no lugar do operador instanceof para verificação de tipos manual, porque a expressão x instanceof y apenas verifica a existência de x na cadeia de protótipos y (e, no ActionScript 3.0, a cadeia de protótipos não fornece um retrato completo da hierarquia de herança).

 

O operador is examina a hierarquia de herança apropriada e pode ser usado para verificar não apenas se um objeto é uma ocorrência de uma classe específica, mas também de uma classe que implementa uma determinada interface. O exemplo a seguir cria uma ocorrência da classe Sprite, chamada mySprite e usa o operador is para testar se mySprite é uma ocorrência das classes Sprite e DisplayObject e se implementa a interface IEventDispatcher:

 

var mySprite:Sprite = new Sprite();

trace(mySprite is Sprite); // true

trace(mySprite is DisplayObject);// true

trace(mySprite is IEventDispatcher); // true

 

 

O operador is verifica a hierarquia de herança e relata adequadamente que mySprite é compatível com as classes Sprite e DisplayObject (a classe Sprite é uma subclasse da classe DisplayObject). O operador is também verifica se mySprite é herdada de alguma classe que implementa a interface IEventDispatcher. Como a classe Sprite é herdada da classe EventDispatcher, que implementa a interface IEventDispatcher, o operador is relata corretamente que mySprite implementa a mesma interface.

 

O exemplo a seguir mostra os mesmos testes do exemplo anterior, mas com instanceof em vez do operador is. O operador instanceof identifica corretamente que mySprite é uma ocorrência de Sprite ou DisplayObject, mas retorna false quando usado para testar se mySprite implementa a interface IEventDispatcher.

 

trace(mySprite instanceof Sprite); // true

trace(mySprite instanceof DisplayObject);// true

trace(mySprite instanceof IEventDispatcher); // false

 

 

O operador as

 

O operador as, que é novo no ActionScript 3.0, também permite verificar se uma expressão é um membro de um determinado tipo de dados. Diferentemente do operador is, porém, o operador as não retorna um valor booleano. Em vez disso, o operador as retorna o valor da expressão em vez de true e null em vez de false. O exemplo a seguir mostra os resultados do uso do operador as em vez de is no caso simples de verificar se uma ocorrência de Sprite é um membro dos tipos de dados DisplayObject, IEventDispatcher e Number.

 

var mySprite:Sprite = new Sprite();

trace(mySprite as Sprite); // [object Sprite]

trace(mySprite as DisplayObject); // [object Sprite]

trace(mySprite as IEventDispatcher); // [object Sprite]

trace(mySprite as Number); // null

 

Durante o uso do operador as, o operando à direita deve ser um tipo de dados. Uma tentativa de usar uma expressão diferente de um tipo de dados como operando à direita resultará em um erro.

 

 

Fonte: PROGRAMAÇÃO DO ACTIONSCRIPT 3.0 PARA FLASH - pág 56 e 57

Linguagem e sintaxe do ActionScript

 

download do PDF de Ajuda em pt_BR (10 MB) >> http://help.adobe.com/pt_BR/ActionScript/3.0_ProgrammingAS3/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom Elektra

 

um pequeno adentro

 

 

o operador as não serve apenas para saber se um objeto é um membro de um determinado tipo de dados

mas também para fazer a "conversão"(o termo correto é fazer o cast) de um objeto para outro tipo de dados

 

um exemplo que usamos com frequência, é esse:

 

 

suponha que você quer pegar o objeto que disparou um evento:

 

botaoA.addEventListener(MouseEvent.CLICK, onMouseClickEvent);

public function onMouseClickEvent(evt:MouseEvent)
{
 var bt:MovieClip = evt.currentTarget as MovieClip; 
 trace(bt);// [object MovieClip]
}

 

usando o operador as, a propriedade "currentTarget", que é do tipo Object, foi "CASTiada" :D , para o tipo MovieClip

 

 

existe uma outra forma de fazer o cast é assim:

 

public function onMouseClickEvent(evt:Event)
{
 var bt:MovieClip = MovieClip(evt.target); 
 trace(bt);
}

 

 

a diferença entre esse ultimo modo, e usar o operador as é simples,

no caso do as, se ele não conseguir fazer o cast, ele vai retornar o valor null

já o segundo modo mostrado, se não conseguir fazer o cast, ele vai acusar um erro(e parar a execução do resto do código),

mas que pode ser tratado usando um try...catch

 

 

bem, é isso ;)

 

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada pelo extra, Eder.

 

 

Busquei descrições sobre o uso dos operadores, fica melhor que apenas ver em uso, amplia o entendimento.

 

 

Exemplo com o operador 'is' ao listar (acessar) objetos aninhados:

 

//import flash.display.MovieClip;
//import flash.display.DisplayObject;
//import flash.display.DisplayObjectContainer;

function showChildren(dispObj:*):void {
for (var i:uint = 0; i < dispObj.numChildren; i++) {
	var obj:DisplayObject = dispObj.getChildAt(i);
	if (obj is DisplayObjectContainer) {
		trace(obj.name, obj);
		showChildren(obj);
	} else {
		trace(obj);
	}
}
}

showChildren(stage);

obs: agradecimentos ao carneirinho e brunobispo que me auxiliaram no tópico com este exercício, adicionando exemplos e comentários valiosos >> http://forum.imasters.com.br/topic/420238-lista-de-exibicao-displayobject/page__p__1655827__hl__displayobject__fromsearch__1#entry1655827

 

 

 

 

Exemplo do operador 'as' ao fazer uma verificação:

 

function clique(evt:MouseEvent):void
{
       if (ativo != evt.currentTarget)
       {
               trace("clique");
               ativo.gotoAndPlay("out");
               ativo = evt.currentTarget as MovieClip;
               ativo.gotoAndPlay("over");
       }
}

obs: agradecimentos ao foxn que fez a adaptação (para minha necessidade) com este code do Michel Araújo.

 

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parabéns, Elektra. Ótima contribuição.

 

Pra não deixar de acrescentar alguma coisa, destaco outro detalhe na explicação do @Eder Fortunato. O operador as, que é uma alternativa de casting de modo geral, é obrigatório para o casting de objetos Array. Isso porque usar Array(myObject) tem o mesmo efeito de new Array(myObject), o que criaria uma cópia do objeto ao invés de só converter o tipo.

 

var arr:Object = [1, 2, 3];
trace(Array(arr) == arr); // false
trace((arr as Array) == arr); // true

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada Bruno.

 

Para quem estuda AS3 estas observações são muito bem vindas, antecipam a utilização adequada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.