quinta-feira, 24 de março de 2011

Classe Abstrata em Actionscript 3.0

Hoje vou mostrar uma bom jeito de se implementar uma classe abstrata em Actionscript 3.0. Para quem trabalha em equipe de programadores é uma boa prática, pois ajuda bastante no encapsulamento do código e não engessa a manutenção no futuro.

Um bom exemplo seria de um componente (AbstractLayout) que dispõe elementos na tela horizontalmente e verticalmente, e você teve que implementar o cálculo desse posicionamente baseado numa flag. Então, para deixar explícito esses dois tipos de disposição, você poderia criar a HorizontalLayout e VerticalLayout que estenderiam a AbstractLayout, mudando a flag de disposição internamente. Isso também melhora o encapsulamento, pois se houver algum comportamento específico para alguma das super classes, esse comportamento pode ser implementado sem interfirir na sub classe.

Enfim, vamos ao código. A implementação é muito simples, é feito uma comparação se a instância passada no argumento é o this, senão é lançado um erro.

   1: package net.idemax.abstractclass
   2: {
   3:     import flash.errors.IllegalOperationError;
   4:  
   5:     public class AbstractClass
   6:     {
   7:         public function AbstractClass( $instance:AbstractClass )
   8:         {
   9:             if( $instance != this )
  10:                 throw new IllegalOperationError( 'Essa é uma classe abstrata, estenda-a para usá-la.' );
  11:         }
  12:     }
  13: }

E é só usá-la como sub classe, passando o this no super. Por exemplo:



   1: package net.idemax.superclass
   2: {
   3:     import net.idemax.abstractclass.AbstractClass;
   4:  
   5:     public class SuperClass extends AbstractClass
   6:     {
   7:         public function SuperClass()
   8:         {
   9:             super( this );
  10:         }
  11:     }
  12: }

Assim, podemos usar todas as funcionalidades da AbstractClass e da SuperClass sem instanciar diretamente a AbstractClass.



   1: package
   2: {
   3:     import flash.display.Sprite;
   4:  
   5:     import net.idemax.superclass.SuperClass;
   6:  
   7:     public class SuperClassUsage extends Sprite
   8:     {
   9:         public function SuperClassUsage()
  10:         {
  11:             var mySuperClass:SuperClass = new SuperClass();
  12:         }
  13:     }
  14: }

Fonte: http://goo.gl/UG6R9


PS.: Estou usando esse plugin do Windows Live Writer para formatar o código fonte, infelizmente ele não suporta Actionscript. Se souberem de algum, me enviem.