Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º...

14
Métodos Programação II 1 Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre Classes Abstractas

description

Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre. Classes Abstractas. Definições da SuperClasse. Muitas vezes torna-se difícil definir o interface que constitui a API da superclasse. - PowerPoint PPT Presentation

Transcript of Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º...

Page 1: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 1

Métodos de Programação II(Mestrado Integrado em Engenharia de Comunicações)

1º Ano, 2º Semestre

Classes Abstractas

Page 2: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 2

Definições da SuperClasse• Muitas vezes torna-se difícil definir o interface que

constitui a API da superclasse.• Há necessidade de certos métodos existirem na

superclasse pelo simples facto de queremos todos objectos das suas subclasses a responderem ao protocolo definido pelo conjunto destes métodos.

• Exemplo:

Sabemos que as subclasses de FORMA tem de responder às interrogaçõesaos métodos area() e perimetro(). Cada subclasse terá a sua implementação especifica.Mas o que escrever sobre estes métodas na superclasse FORMA ?

Page 3: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 3

SuperClasses (2)

• Na hierarquia anterior temos a certeza que todos os objectos dequalquer classe responde a area() e a perimetro().• A certeza vem do facto de FORMA implementar estes métodos. Assimpor herança ou por redefinição qualquer objecto desta hierarquia respondeaos métodos em questão.• Uma dúvida surge: o que escrever na classe FORMA, por forma a que seja útil e reutilizável por todas as suas actuais e futuras subclasses.• Uma possível solução: escrever algo “dummy” que a primeiracoisa a fazer pelo programador da subclasse é reescrever o método.•Exemplo:

public double area() { return Double.MIN_VALUE; }public double perimetro() { return Double.MAX_VALUE; }

• Uma solução: deixar as definições propositadamente incompletas.

Page 4: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 4

Classes Abstractas• Classes Abstractas são exactamente todas as classes nas quais

pelo menos um ou mesmo todos os métodos de instância não se encontram implementados, mas tão só declarados sintacticamente (daí serem designados como métodos abstractos ou virtuais).

• No nosso exemplo, FORMA deve definir sintacticamente os métodos que as suas subclasses devem implementar.

• Exemplo:public abstract class Forma {// definição dos métodos…

public abstract double area();public abstract double perimetro();

}

• Para uma classe dever ser considerada abstracta basta não implementar um método.

• Uma classe abstracta não tem instâncias.

Page 5: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 5

Classes Abstractas (2)

• Uma classe abstracta é também (sobretudo) um tipo.• Assim a expressão: Forma f = new Triangulo(); continua a ser válida!• As subclasses de uma classe abstracta herdam o compromisso

(obrigação) de implementar os métodos abstractos. Ou seja, a superclasse delega na subclasse a sua implementação.

• Mas podemos ter uma hierarquia com várias classes abstractas. No entanto, pelo menos as classes folhas têm de implementar os métodos abstractos herdados.

• Numa classe 100% abstracta, todas as suas subclasses respondem ao mesmo protocolo i.e. falam a mesma linguagem que foi herdada.

• Uma classe 100% abstracta pode ser vista como uma especificação meramente sintáctica (ou seja, uma assinatura de um tipo de dados),

É sobretudo um tipo!

Page 6: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 6

Classes Abstractas: resumo

• Funções das Classes Abstractas:

– Escrever especificações sintácticas para as quais múltiplas implementações são possíveis, de momento ou no futuro;

– Normalizar a “linguagem” (API) a partir de certos pontos da hierarquia;

– Introduzir flexibilidade e generalidade no código desenvolvido;– Tirar todo o partido do polimorfismo (via princípio da

substituição);– Realizar classificações mais claras de subclasses.

Page 7: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 7

Concretização do exemplo FORMApublic abstract class Forma { // Classe abstracta public abstract double area(); public abstract double perimetro();}

public class Circulo extends Forma { // variáveis de instância private double raio; // construtores public Circulo() { raio = 1.0; } public Circulo(double r) { raio = (r <= 0.0 ? 1.0 : r); } // métodos de instância public double area() { return PI*raio*raio; } public double perimetro() { return 2*PI*raio; } public double raio() { return raio; }}

public class Rectangulo extends Forma {// variáveis de instânciaprivate double comp, larg;// construtorespublic Rectangulo() { comp = 0.0; larg = 0.0; }public Rectangulo(double c, double l) { comp = c; larg = l; }// métodos de instânciapublic double area() { return comp*larg; }public double perimetro() { return 2*(comp+larg);}public double largura() { return larg; }public double comprimento() { return comp; }}

public class Triangulo extends Forma{ /* altura tirada a meio da base */ // variáveis de instância private double base, altura; // construtores public Triangulo() { base = 0.0; altura = 0.0; } public Triangulo(double b, double a) { base = b; altura = a;} // métodos de instância public double area() { return base*altura/2; } public double perimetro() { return base + (2*this.hipotenusa()); } public double base() { return base; } public double altura() { return altura; } public double hipotenusa() { return sqrt(pow(base/2, 2.0) + pow(altura, 2.0)) ;}}

CIRCULO RECTANGULO

TRIANGULO

Page 8: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 8

Métodos específicos das subclasses

• Numa colecção de objectos FORMA como comunicar com as métodos específicos de triângulo?

Forma f = new Rectangulo(4.0, 6.0);

int b = f.comprimento();

• No entanto, podemos usar mecanismos de casting para comunicar com Triângulos:

if(f instanceof Rectangulo) // testa tipo dinâmico

int b = (Rectangulo f).comprimento();

else

. . . . .

Erro de compilação!!!

Page 9: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 9

Classes abstractas e Variáveis de instância

• Pode haver necessidade de definir na classe abstracta atributos comuns às suas subclasses.

public abstract class ItemMulti { // variáveis private String titulo; private String data; private String obs; // métodos para redefinição public abstract double duracao();}

Falta definir um constructor para esta classe abstracta, onde se inicializa as suas variáveis de instância!public ItemMulti(String tit, String dat, String com) { titulo = tit; data = dat; obs = com; }

Page 10: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 10

Cont()• Embora não seja possível criar instâncias de uma classe

abstracta faz sentido estas terem construtores (para inicializar as suas variáveis de instância)

public class Hi8 extends ItemMulti{ // Variáveis de Instância private int minutos; private double ocupacao; private int gravacoes; // Construtores public Hi8(String titulo, String data, String obs, int min, double ocup, int gravc) { super(titulo, data, obs); // super ?? this.minutos = min; this.ocupacao = ocup; this.gravacoes = gravc; } . . . . . .}

Page 11: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 11

Classes Abstractas na API do Java• Muitas vezes funcionam como máximos denominadores

comuns… (onde não é fácil ter uma relação de inclusão)

• Por vezes reúnem as operações sobre uma abstracção (conjunto matemático). Neste caso específico a superclasse especificaas operações que devem existir sobre um conjunto de objectos. As subclasses implementam estas operações usando estruturas de dadosespecíficas.

Todas as classes são classes

parametrizadas

TreeSet<String> a;TreeSet<Ponto> b;

Page 12: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 12

Método equals() e Herança

• Na definição de igualdade, temos de ter em conta o que é herdado. Exemplo para a classe Ponto3D.

public boolean equals(Object obj) {

if ( this == obj ) return true; // é o próprio !!if ( obj == null ) return false;if ( this.getClass() != obj.getClass() ) return false;// Aqui temos a certeza que é um Ponto3DPonto3D pp = (Ponto3D) obj; // casting obrigatórioreturn super.getX() == pp.getX() &&

super.getY() == pp.getY() && this.z == pp.getZ();}

Page 13: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 13

Exercícios• Definir uma classe abstracta Forma.• Definir a seguinte hierarquia de classes:

• Implementar os métodos apresentados.• Definir a classe FigGeo que guarda um conjunto de figuras

geométricas.• Adicionar a classe Quadrado e Elipse (subclasse de Círculo)• Implementar um método que determina a figura com a maior área e

qual o seu tipo e outro método para o maior perímetro. • Um método para contabilizar o número de figuras por tipo.

Page 14: Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre

Métodos Programação II 14

Exercícios (2)• Criar um banco que guarda as contas num ArrayList• Definir uma classe abstracta Conta.• Definir vários novos tipos de contas: conta à ordem,

conta a prazo, conta jovem, conta ordenado e capital:– Prazo, tem uma taxa e um número de dias. Só há um debito que

coincide com o final do prazo.– Jovem, tem taxa fixa de 1% TANB – Ordenado, dá um plafond de um valor pré definido. Isto é,

permite estar com saldo devedor até ao montante estabelecido.– Conta Capital, que contém uma taxa de juro variável, indexada

por períodos. A rentabilidade é calculada sobre estes períodos. O plafond desta conta é indexado ao capital investido.

• Contar número de contas por tipo, inserir contas na classe Banco e calcular despesa em juros que o banco tem que pagar.