Herança, Polimorfismo, Classes e Métodos Abstratos

Prática em laboratório

Objetivos:

Entender e verificar o uso de técnicas de reuso de software através de herança

Criar e utilizar classes e métodos abstratos

Entender e verificar o uso de polimorfismo

 

1. Herança


A herança proporciona o reuso de software da seguinte maneira: novas classes são criadas a partir de outras já existentes, absorvendo atributos e
comportamentos e adicionando os seus próprios.

No entanto, atenção: nem todos os membros da superclasse são obrigatoriamente acessíveis na subclasse. Isto dependerá
dos atributos de acesso do membro. Portanto, lembre sempre dos atributos de acesso:

Em caso de dúvida de como utilizá-los, verifique as regras abaixo:

E algumas exceções:

 


Exercício 1: Herança

Abra o ambiente de sua preferência e crie um projeto para a aula de hoje chamado HerançaPolimorfismo. Dada a classe Circulo apresentada abaixo, que possui um objeto Ponto como atributo, implemente uma nova classe CirculoColorido utilizando herança. Esta nova classe apresenta o mesmo comportamento de Circulo, mas possui a capacidade adicional de manter a informação da cor de desenho do traçado do círculo e uma cor interna para o preenchimento da figura geométrica. A modelagem em UML e o código original da classe Circulo são apresentados a seguir para ajudá-lo na tarefa. Implemente também uma classe TestaHeranca que possua o método main, crie vários objetos no método main e teste a chamada dos métodos.

public class Ponto 
{
    private double x;
    private double y;
    public Ponto(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public void setX (double xVal) { x = xVal; }
    public void setY (double yVal) { y = yVal; }
    public double getX() { return(x); }
    public double getY() { return(y); }
    public String toString() {
         String str = "(" + x + "," + y + ")";
         return str;
    }
}
 
public class Circulo 
{
   private Ponto centro;
   private double raio; 
   public Circulo(double x, double y, double r) {
      if (x < 0) x = 0;
      if (y < 0) y = 0;
      Centro = new Ponto(x,y);
      if (r > 0) raio = r;
      else raio = 1;
   }
   public void mover(double x, double y) {
      centro.setX(x);
      centro.setY(y);
   }
   public void aumentar() {
      raio++;
   }
   public void diminuir() {
      raio--;
   }
   public double getX() {
      return centro.getX();
   }
   public double getY() {
      return centro.getY();
   }
   public double getRaio() {
      return raio;
   }
}

 


 

2. Polimorfismo


Polimorfismo é a característica única de linguagens orientadas a objetos que permite que diferentes objetos respondam a mesma mensagem cada um a sua maneira.

Em termos de programação, polimorfismo representa a capacidade de uma única referência invocar métodos diferentes, dependendo do seu conteúdo.

Assim, usa-se uma referência da superclasse para armazenar referências para instâncias de subclasses. Entretanto, através dessa “referência genérica” só é possível acessar os métodos das subclasses que pertençam à interface comum com a superclasse.

Quando referências de uma superclasse são utilizadas para referenciar instâncias de subclasses, a compilação fará a checagem pelos tipos da referência. Na hora da execução, porém, o que conta é a classe a qual pertence a instância referenciada. Esse mecanismo que permite ao Java decidir em tempo de execução qual o método que será ativado em função da classe a qual pertence a instância referenciada é chamado de ligação dinâmica.

O fato de Java implementar ligação dinâmica é que permite que o mesmo explore a característica do polimorfismo. Explorando esta característica é possível construir algoritmos genéricos que trabalham com as referências para uma superclasse, mas que se aplicam as subclasses sem a necessidade de testes para determinar o tipo de instância que está sendo referenciada.

Teste o funcionamento do polimorfismo da seguinte maneira:

 

1.     Uma solução para criar e manipular uma lista de professores utilizando um ArrayList é declarar e usar somente um ArrayList de Professor. Crie uma classe que implemente um método main, e, dentro dele, instancie um ArrayList de Professor, inclua dois professores DE e dois professores Horista e depois liste o nome e o salário de cada professor!!

 

2.     Agora vamos trabalhar com polimorfismo de método. Inicialmente, altere a classe Professor para que também implemente o método getSalario(). Desta forma, não será mais necessário testar pelo tipo de objeto que está armazenado dentro do ArrayList, podendo-se simplesmente utilizar p.getSalario(). Veja a seguir como fazer estas alterações.

public class Professor {
   private String nome;
   private int matricula;
   private int cargaHoraria;
   ...
   public double getSalario() { return 0; }
}
...
...
System.out.println("Salário dos Professores:");
for(Professor p : cadProfessor) {
      System.out.println(p.getNome() + " " + p.getSalario());
}
      

 

3.     Observe que na prática nunca iremos instanciar um objeto Professor e que o método getSalario() desta classe não possui nenhuma função. Portanto, altere a classe Professor e o método getSalario() para que sejam abstratos. Depois execute o programa e veja como tudo continua funcionando normalmente!


 

 


Exercício 2: Polimorfismo

Um sistema de folha de pagamento de uma empresa guarda informações sobre seus funcionários como nome, número de matricula e endereço. Além disso, caso um funcionário seja um chefe é armazenado o seu salário mensal. Caso o funcionário trabalhe por comissão, ele possui um salário mensal, um valor de comissão por item vendido e o total de itens vendidos. Caso o funcionário trabalhe por hora ele possui o valor que recebe por hora trabalhada e a quantidade de horas trabalhadas. A qualquer momento deve ser possível calcular o salário mensal de cada funcionário, bem como imprimir todos os dados de um determinado funcionário.

 Faça uma modelagem para representar a descrição acima, considerando os conceitos de polimorfismo e classes abstratas. A partir desta modelagem realize a implementação das classes modeladas (não é necessário realizar o cadastro completo de funcionários).


 


 
  Obs.: Esta aula prática foi adaptada do material dos professores Marcelo Cohen, Bernardo Copstein, Márcia Moraes e Julio P. Machado