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:
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; } }
|
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
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!
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