Typed Arrays no ActionScript 3
O compilador MTASC para Actionscript 2 implementava uma funcionalidade (através de comentários) que permitia o compilador fazer uma checagem do tipo de dados dos elementos do array, mimetizando a funcionalidade de typed arrays (porém apenas na compilação). Hoje o ActionScript 3 também suporta essa mesma funcionalidade, utilizando o metadado
1 | <strong>ArrayElementType</strong> |
.
Contudo, a checagem é feito apenas em tempo de compilação, tal como era com o MTASC e similar ao generics em collections no Java 5. No AS 3, durante o runtime não há mais essa informação, e é possível adicionar um elemento de um outro tipo, que não o especificado com o metadado.
Ainda assim o
1 | ArrayElementType |
é muito útil, e principalmente para implementação de componentes. A propriedade
1 | states |
do UIComponent, por exemplo, está definido para ser um array de
1 | mx.states.State |
. O mesmo acontece com a propriedade
1 | transitions |
(um array de
1 | mx.states.Transition |
). Assim, ao utilizar esse propriedade, se por ventura o programador digitar algo errado, ainda em tempo de compilação ele saberá do ocorrido.
Por exemplo, se um Accordion só puder ter childs de um determinado tipo (para montagem de um menu, por exemplo):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package { import mx.containers.Accordion; public class AccordionMenu extends Accordion { [ArrayElementType('mx.containers.VBox')] public var menus:Array; public function AccordionMenu() { super(); } override protected function createChildren():void { for (var i:int = 0; i < menus.length; i++) { addChild(menus[i]); } super.createChildren(); } } } |
O metadata
1 | ArrayElementType |
logo acima do array
1 | menus |
, indica que ele só pode consistir de elementos do tipo
1 | mx.containers.VBox |
. Se por um acaso um
1 | Panel |
estiver contido ali, o compilador acusará um erro.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <local:AccordionMenu width="100" height="400"> <local:menus> <!-- a variável menus só pode conter VBox! <mx:Panel> </mx:Panel> --> <mx:VBox> </mx:VBox> <mx:VBox> </mx:VBox> </local:menus> </local:AccordionMenu> |
A utilidade dessa abordagem se torna mais evidente quando pensamos em componentes, ou até mesmo no uso de interfaces (o tipo de classe, não a visual). Um componente de relatório pode conter um gráfico, um filtro e um conjunto de ações. Essas ações podem ser passadas por quem utilizar esse componente como um array de botões apenas. O implementador do componente não terá como utilizar um
1 | Panel |
numa área designada apenas à botões.

Um comentário
interesting
Deixe Seu Comentário