Programação com Objectos Processamento de Dados I 4. Classes Abstractas 1 4. Classes Abstractas | Conceito de classe abstracta | Declaração de uma classe abstracta | Implicações e características das classes abstractas | Utilização de classes abstractas 100% abstractas | Conclusão | Exemplo Programação com Objectos / Processamento de Dados I 2 4. Classes Abstractas | Conceito de classe abstracta z Uma definição comum para classes é a de que uma classe representa uma entidade do mundo real. Contudo existem situações em que o que se quer representar não é concreto. Recorre-se então à chamada classe abstracta. z Classe abstracta: • Todas as classes nas quais pelo menos um método de instância não se encontra implementado, mas apenas declarado (método abstracto). • Uma classe abstracta não pode criar instâncias. • O mecanismo de herança mantém-se aplicável a classes abstractas. Programação com Objectos / Processamento de Dados I 3 4. Classes Abstractas | Declaração de uma classe abstracta modificador abstract class nome_da_classe { //metodos de instancia abstractos modificador abstract tipo nome_método(); } Em UML as classes e métodos abstractos são representados com o identificador/assinatura em itálico. Nome_da_classe modificador nome_método(argumentos): tipo_saída Programação com Objectos / Processamento de Dados I 4 4. Classes Abstractas | Declaração de uma classe abstracta Consideremos o seguinte exemplo: Figura Circulo Rectângulo Triângulo A classe figura é uma classe abstracta que contém dois métodos abstractos que permitem calcular a área e o perímetro de uma figura geométrica. A sua declaração seria: public abstract class Figura { //metodos de instancia abstractos public abstract double area(); public abstract double perimetro(); } Programação com Objectos / Processamento de Dados I 5 4. Classes Abstractas | Declaração de uma classe abstracta A sua declaração seria: Em java: public abstract class Figura { //metodos de instancia abstractos public abstract double area(); public abstract double perimetro(); } Em UML: Figura + area () : double + perimetro () : double Programação com Objectos / Processamento de Dados I 6 4. Classes Abstractas | Implicação / características das classes abstractas z Qualquer subclasse de uma classe abstracta herda automaticamente todos os métodos da classe abstracta, quer estejam implementados ou sejam abstractos. z Qualquer subclasse de uma classe abstracta terá de implementar todos os métodos abstractos herdados da sua superclasse (sem excepção) para que possa ser uma classe de implementação concreta, isto é, para que possa ter instâncias. Caso contrário será também uma classe abstracta. z Uma classe abstracta delega nas suas subclasses a responsabilidade pela implementação dos seus métodos abstractos, facilitando o aparecimento de diferentes implementações dos mesmos métodos nas suas subclasses. Programação com Objectos / Processamento de Dados I 7 4. Classes Abstractas | Utilização de classes 100% abstractas o mecanismo de herança garante que todas as suas subclasses vão herdar o mesmo protocolo ou API, podendo no entanto definir as suas extensões. todas as subclasses da classe abstracta responderão ao mesmo protocolo, ou seja, “falam a mesma linguagem” normalização de vocabulário para as subclasses existentes e para as futuras subclasses o polimorfismo da linguagem JAVA garantirá a correcta execução desta “linguagem comum”. classe 100% abstracta pode ser vista como uma assinatura (especificação meramente sintáctica). Programação com Objectos / Processamento de Dados I 8 4. Classes Abstractas | Conclusão Permitem escrever especificações sintácticas para as quais múltiplas implementações são possíveis de momento ou de futuro. Permitem normalizar a “linguagem” (API) a partir de certos pontos da hierarquia. Permitem introduzir flexibilidade e generalidade nas classes criadas. Permitem tirar todo o partido do polimorfismo (via substitutividade). Programação com Objectos / Processamento de Dados I 9 4. Classes Abstractas | Conclusão Ocupam normalmente os níveis mais elevados das hierarquias. Devem declarar o maior número possível de métodos abstractos, pois passarão a constituir a linguagem comum (API) das suas subclasses. O número de métodos abstractos dependerá da análise de requisitos do problema. Colocar variáveis ou código concreto numa classe abstracta em geral não é aconselhável em JAVA pois todas as suas subclasses presentes e futuras irão herdar tais variáveis e métodos. Poderá no entanto haver situações em que colocar o máximo de funcionalidade numa classe abstracta seja vantajoso. Em geral, as classes abstractas em JAVA devem ser 100% abstractas. Programação com Objectos / Processamento de Dados I 10 4. Classes Abstractas | Exemplo Vamos implementar o exemplo da figura geométrica: Figura Circulo Triangulo Rectangulo Quadrado Programação com Objectos / Processamento de Dados I 11 4. Classes Abstractas | Exemplo | Um objecto de uma classe abstracta nunca pode ser criado. É possível fornecer um construtor que pode ser chamado pela classe derivada, para iniciar os membros privados. A classe abstracta Figura poderia ser: | | public abstract class Figura { private String nome; public Figura (String nomeFigura) { nome = nomeFigura; } public String getNome() { return nome; } public abstract double area(); public abstract double perimetro(); } Programação com Objectos / Processamento de Dados I 12 4. Classes Abstractas | Exemplo | A classe Circulo tem como atributos o PI e o raio. A classe Circulo poderia ser: | public class Circulo extends Figura { private static final double PI = 3.14159265358979323; private double raio; public Circulo (double raio) { super(“Circulo”); this.raio = raio; } public double area() { return PI * Math.pow (raio, 2); } public double perimetro() { return 2 * PI * raio; } } Programação com Objectos / Processamento de Dados I 13 4. Classes Abstractas | Exemplo | A classe Triangulo tem como atributos a base e a altura (apenas para triângulo rectângulos). A classe Triangulo poderia ser: | public class Triangulo extends Figura { private double base, altura; public Triangulo (double base, double altura) { this.base = base; this.altura = altura; } public double area() { return base * altura / 2; } public double perimetro() { return base + altura + Math.sqrt(base*base + altura*altura); } } Programação com Objectos / Processamento de Dados I 14 4. Classes Abstractas | Exemplo | A classe Rectangulo tem como atributos o comprimento e a largura. A classe Rectangulo poderia ser: | public class Rectangulo extends Figura { private double comp, larg; public Rectangulo (double comp, double larg) { this.comp = comp; this.larg = larg; } public double area() { return comp * larg; } public double perimetro() { return 2*(comp + larg); } } Programação com Objectos / Processamento de Dados I 15 4. Classes Abstractas | Exemplo | A classe Quadrado não necessita de atributos porque sendo um caso especial de um rectângulo pode herdar as suas carcaterísticas. A classe Quadrado poderia ser: | public class Quadrado extends Rectangulo { public Quadrado (double lado) { super (lado,lado) } } Programação com Objectos / Processamento de Dados I 16