1 / 14

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

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.

zlhna
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Métodos de Programação II(Mestrado Integrado em Engenharia de Comunicações)1º Ano, 2º Semestre Classes Abstractas 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ções aos métodos area() e perimetro(). Cada subclasse terá a sua implementação especifica. Mas o que escrever sobre estes métodas na superclasse FORMA ? Métodos Programação II

  3. SuperClasses (2) • Na hierarquia anterior temos a certeza que todos os objectos de • qualquer classe responde a area() e a perimetro(). • A certeza vem do facto de FORMA implementar estes métodos. Assim • por herança ou por redefinição qualquer objecto desta hierarquia responde • aos 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 primeira • coisa 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. 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. Métodos Programação II

  5. Classes Abstractas (2) É sobretudo um tipo! • 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), 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. Métodos Programação II

  7. Concretização do exemplo FORMA public abstract class Forma { // Classe abstracta public abstract double area(); public abstract double perimetro(); } TRIANGULO 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)) ;} } RECTANGULO CIRCULO public class Rectangulo extends Forma { // variáveis de instância private double comp, larg; // construtores public Rectangulo() { comp = 0.0; larg = 0.0; } public Rectangulo(double c, double l) { comp = c; larg = l; } // métodos de instância public double area() { return comp*larg; } public double perimetro() { return 2*(comp+larg);} public double largura() { return larg; } public double comprimento() { return comp; } } 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; } } 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!!! 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; } 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; } . . . . . . } 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 especifica • as operações que devem existir sobre um conjunto de objectos. • As subclasses implementam estas operações usando estruturas de dados • específicas. Todas as classes são classes parametrizadas TreeSet<String> a; TreeSet<Ponto> b; 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 Ponto3D Ponto3D pp = (Ponto3D) obj; // casting obrigatório return super.getX() == pp.getX() && super.getY() == pp.getY() && this.z == pp.getZ(); } 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. 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. Métodos Programação II

More Related