Posts Tagged: classes abstratas


7
Apr 09

Classes Abstratas

Embora o ActionScript ainda não tenha recursos de classes e métodos abstratos, não custa não a gente procurar entender um pouquinho mais de Orientação a Objetos. De repente na próxima versão do AS a gente consegue criar classes que não sejam concretas e daí você já vai saber as razões e os motivos de usá-las.

Normalmente as pessoas comparam muito interfaces com classes abstratas, mas são coisas completamente distintas e com objetivos bem diferentes, por isso, ao contrário da maioria, não vou abordar as duas coisas juntas.

Características das classes abstratas:

  • Pode-se dizer que é uma classe incompleta.
  • Não pode ser instanciada (perfeitamente justificada pelo item acima).
  • Pode ou não ter métodos abstratos (tem quem diga que deve ter pelo menos um, caso contrário poderia ser uma classe concreta, mas isso é uma questão de ponto de vista e de quão a risca se deve seguir a teoria).
  • Uma classe que tenha um método abstrato deve ser obrigatoriamente declarada como abastrata, ou seja, não existe método abstrato fora de uma classe abstrata.
  • Pode ou não ter métodos concretos.
  • Quando uma classe concreta herdar uma classe abstrata todos os métodos abstratos devem ser implementados.
  • Uma classe abstrata pode herdar outra classe abstratas e os métodos abstratos só serão obrigatórios na primeira classe concreta da hierarquia.

Assim como com classes concretas e interfaces podemos utiizar delas também para realizar operações polimórficas.

As classes abstratas são bastante usadas como template, se quiser entender um pouquinho mais sobre isso, dá uma olhadinha aqui: Template Method.


25
Mar 09

Template Method

O Template Method é um padrão de projeto que tem como objetivo definir uma base do código (algorítimo ou funcionalidade), deixando que as subclasses completem as tarefas, mas sem alterar a estrutura base.

Se você reparar bem, quando falamos de aproveitamento de código em OOP, esse padrão é a base de quase tudo – ou a base de quase tudo se parece muito com ele. O problema dele em relação ao ActionScript é que ele é baseado em classes e métodos abstratos e como a linguagem ainda não disponibiliza este recurso, podemos apenas tapar um olho e simular o padrão.

Nota: Eu particularmente gosto de usar o prefixo Base em todas as classes que crio em AS e que em teoria deveriam ser classes abstratas. Ao menos assim existe uma forma simples e rápida de identificá-las dentro da estrutura de um projeto ou framework.

Segue um exemplo extremamente simples (e sem funcionalidade) só para entendermos alguns conceitos. 

Classe “abstrata”:

package
{
	public class BaseTest extends MovieClip
	{
		public function BaseTest()
		{
		}
 
		// definindo um método que não pode ser sobrescrito
		public final function finalMethod():void
		{
			// chamada a método opcional (gancho)
                        this.hookMethod();
 
                        // implementação padrão
			this.x = 200;
 
			// chamada ao método que será sobrescrito
			this.customMethod();
		}
 
		// método que deveria ser abstrato
		protected function customMethod():void
		{
			// implementação na classe concreta
		}
 
		// método gancho que pode ou não ser sobrescrito
		protected override function hookMethod():void
		{
		}
        }
}

Classe concreta:

package
{
	public class CustomTest extends BaseTest
	{
		public function CustomTest()
		{
		}
 
		// método que deveria ser abstrato
		protected override function customMethod():void
		{
			// implementação personalizada obrigatória
			this.y = 45;
                }
        }
}

Neste padrão as chamadas normalmente ocorrem mem modo inverso daqueles que normalmente aplicamos. Ao invés de fazer a chamada ao código comum (ou código reutilizado) na classe filha (CustomTest), fazemos as chamadas pela classe pai (BaseTest). Assim, é possivel garantir o fluxo de execução das tarefas pelo objeto.

Podemos observar também que na classe “abstrata” os métodos públicos (que são implementados) são declarados com a palavra reservada final, isto significa (garante) que ele não poderá ser sobrescrito. Os métodos personalizáveis, ao contrário, são declarados como protected permitindo que sejam sobrescritos através de herança.

As principais chamadas que a classe “abstrata” faz são as seguintes:

Métodos concretos

Da classe abstrata – implementações úteis a todas as classes filhas -, da classe concreta ou de outras classes.

Métodos abstratos

Devem obrigatoriamente ser sobrescritos. Isto é um problema pois não conseguimos garantir a sobrescrita de um método utilizando ActionScript a não ser que seja por interfaces.

Métodos ganchos

Podem ou não ser sobrescritos e são uma implementação opcional. É uma maneira de utilizar herança de forma controlada. Estes métodos não possuem implementação na classe abstrata.

 

É interessante que ao usar essa idéia em ActionScript seja definido um padrão para os nomes dos métodos, que facilite a identificação do métodos que são obrigatórios (teoricamente abstratos) e dos que são opcionais, ainda que não se tenha a garantia de um método abastrato.