Buscar

Prévia do material em texto

Linguagem de Programação
Polimorfismo
Polimorfismo
“Polimorfismo é a característica única
de linguagens orientadas a objetos
que permite que diferentes objetosque permite que diferentes objetos
respondam a mesma mensagem cada
um a sua maneira.”
• Capacidade de assumir formas diferentes.
• Em termos de programação, polimorfismo representa a
capacidade de uma única referência chamar métodos
diferentes, dependendo do que esse referência contém.
• É possível projetar e implementar sistemas que são
Polimorfismo
• É possível projetar e implementar sistemas que são
mais facilmente extensíveis.
• Polimorfismo libera o programador de ter que saber a
classe específica do objeto que recebe uma
mensagem.
• Forma de escrever programas de forma genérica que
permite a manipulação de uma grande variedade de
classes.
• Estilo de programação baseado em passagem de
mensagens no qual objetos de diferentes tipos definem
Polimorfismo
mensagens no qual objetos de diferentes tipos definem
uma mesma interface de operações.
• Em linguagens fortemente tipadas o polimorfismo é
implementado através de herança ou implementação
de interfaces.
• Aspectos importantes:
– Usa-se um tipo único (normalmente do tipo da
superclasse) para armazenar objetos variados do
tipo das subclasses.
– Envolve o uso automático do objeto armazenado na
Polimorfismo
– Envolve o uso automático do objeto armazenado na
superclasse para selecionar um método de uma das
subclasses. O tipo do objeto armazenado não é
conhecido até a execução do programa. A escolha
do método a ser executado é feita dinamicamente.
• Em uma aplicação temos uma classe Conta, a qual
pode ser de três tipos diferentes (subclasses)
– ContaCorrente
– ContaPoupança
– ContaEspecial
• Cada tipo de conta possui um método calculaJuros()
Polimorfismo
• Cada tipo de conta possui um método calculaJuros()
implementado de formas diferentes.
• Em Java, podemos chamar o método calculaJuros()
sobre um objeto conta que será selecionado
automaticamente o método correto das subclasses!
• double juros = umaconta.calculaJuros();
instanceOf
• O tipo específico de um objeto pode ser determinado
utilizando-se o operador instanceOf
– <varobjeto> instanceOf <classe>
– Retorna um valor booleano
• É útil quando se necessita selecionar um método
Polimorfismo
• É útil quando se necessita selecionar um método
específico a ser executado baseado no tipo do objeto.
• Exemplo:
public void operacao(Conta c){
...
if (c instanceOf ContaEspecial){
((ContaEspecial c).aumentaLimite(100);
}
Polimorfismo
}
...
}
– Conta é superclasse de ContaEspecial
– A conversão (cast) explícito é necessário, pois 
aumentaLimite() é um método de ContaSuper e não 
de Conta!
Polimorfismo
• Verificar se dado objeto é do tipo de uma classe.
if (objConta instanceof ContaCorrente)
System.out.println(“Objeto do tipo ContaCorrente”)
else
if (objConta.instanceof ContaPoupanca)
System.out.println(“Objeto do tipo ContaPoupanca”)
• O método getClass() é herdado pelas classes a partir
da classe topo da hierarquia Java, o Object. Assim
pode-se obter a classe de um objeto na forma abaixo:
System.out.println(objConta.getClass());
Polimorfismo
• Duas subclasses de uma mesma classe ou classes de
mesmo tipo (Interface) podem ter implementações
completamente diferentes de um mesmo método, o que
leva os objetos a se comportarem de forma diferente,
dependendo da sua classe de implementação.
• No exemplo anterior podemos dizer que um objeto da
classe ContaCorrente é do tipo Iconta. Um objeto daclasse ContaCorrente é do tipo Iconta. Um objeto da
classe ContaPoupanca é do tipo Iconta.
• No entanto, os dois objetos tem comportamento
distintos ao executar o método obter saldo.
Iconta objConta = new ContaCorrente();
Iconta objPoup = new ContaPoupanca();
Polimorfismo
• Suponha que um conjunto de classes de formas como
Triângulo, Quadrado, Retângulo sejam derivadas de
uma classe FigurasGeométricas.
• Em programação orientada a objetos, cada uma dessas
classes pode ser dotada de uma operação de calcular
sua própria área.
• Cada uma tem seu método próprio calcularArea() com a
implementação desse método diferente para cada forma.
• Poderíamos tratar essas formas genericamente como
objetos da superclasse FigurasGeométricas.
• O programa dinamicamente (durante a execução) irá
acionar o método calcularArea() de acordo com a
subclasse instanciada.
Polimorfismo
Método calculaArea().
Polimorfismo
subclasses Implementações
diferentes
area = b * h / 2
superclasse
area = b * h
Polimorfismo
public static void main (String[] args){
double base = 4; double altura = 6;
FigurasGeometricas fig1 = new Triangulo(base, altura);
FigurasGeometricas fig2 = new Retangulo(base, altura);
double areaT = fig1.calcularArea();
double areaR = fig2.calcularArea();
System.out.println("Base:"+base+" Altura:"+altura
+" Area Triangulo:"+areaT);
System.out.println("Base:"+base+" Altura:"+altura+
" Area Retangulo:"+areaR);
}
Base:4.0 Altura:6.0 Area Triangulo:12.0
Base:4.0 Altura:6.0 Area Retangulo:24.0
Polimorfismo
• Nas implementações a seguir veremos um exemplo de
extensibilidade.
• A classe ContaSimples tem 4 atributos, o construtor, os
métodos sets e gets e um método que retorna uma
descrição de tipo da conta.
public class ContaSimples {
private int numero;private int numero;
private String nomeCliente;
private double saldo;
private int tipo;
public double getSaldo() {
return saldo;
}
. . .
public String obtemDescTipoConta(){
return "Simples";
}
Polimorfismo
• Na classe Relatorio temos um método static que exibe
todos os dados de um objeto do tipo ContaSimples.
public class Relatorio {
public static void imprimeDadosConta(ContaSimples cta){
System.out.print(" Numero:"+cta.getNumero());
System.out.print(" Nome:"+cta.getNomeCliente());System.out.print(" Nome:"+cta.getNomeCliente());
System.out.print(" Tipo:"+cta.obtemDescTipoConta());
System.out.println(" Saldo:"+cta.getSaldo());
}
//seguem-se outros métodos
}
Polimorfismo
• Na classe Principal temos o uso das classes
ContaSimples e Relatorio.
public class Principal {
public static void main(String[] args) {
ContaSimples cta = new ContaSimples(1, "jose", 500.00, 0);
Relatorio.imprimeDadosConta(cta);Relatorio.imprimeDadosConta(cta);
}
}
• Poderíamos exibir os dados do objeto ContaSimples,
sem a necessidade do “imprimeDadosConta”. Vejamos
uma subclasse de ContaSimples.
Polimorfismo
• A ContaPoupanca, dada abaixo, é uma subclasse de
ContaSimples.
• Por ser subclasse e não ter atributos próprios utiliza o
construtor da superclasse.
• Esta classe sobre-escreve os métodos getSaldo() e
obteDescTipoConta().
public class ContaPoupanca extends ContaSimples {public class ContaPoupanca extends ContaSimples {
public static final float TAXA = 0.05f;
public ContaPoupanca (int numero, String nomeCliente, 
double saldo, int tipo){
super(numero, nomeCliente, saldo, tipo);
}
public String obtemDescTipoConta(){
return "Poupança";
}
public double getSaldo (){
return super.getSaldo() * (1 + TAXA);
}
}
Polimorfismo
• Na classe Principal agora temos o uso das classes
ContaSimples, ContaPoupanca e Relatorio.
public class Principal {
public static void main(String[] args) {
ContaSimples cta = new ContaSimples(1, "jose", 500.00, 0);
Relatorio.imprimeDadosConta(cta);Relatorio.imprimeDadosConta(cta);
ContaSimples cp = new ContaPoupanca(1001, "joao", 100, 1);
Relatorio.imprimeDadosConta(cp);
}
}
• Observe o reuso da implementação do método
imprimeDadosConta. Objeto de ContaPoupanca pode
ser referenciado como ContaSimples.
Polimorfismo
• O resultado da execução do método main é dadologo
abaixo da implementação.
public class Principal {
public static void main(String[] args) {
ContaSimples cta = new ContaSimples(1, "jose", 500.00, 0);
Relatorio.imprimeDadosConta(cta);
ContaSimples cp = new ContaPoupanca(1001, "joao", 100, 1);
Relatorio.imprimeDadosConta(cp);Relatorio.imprimeDadosConta(cp);
}
}
Numero:1 Nome:jose Tipo:Simples Saldo:500.0
Numero:1001 Nome:joao Tipo:Poupança Saldo:105.0
Polimorfismo
Sobrescrita (overriding)
• A sobrescrita (ou override) está diretamente relacionada
à orientação a objetos, mais especificamente com a
herança. Com a sobrescrita, conseguimos especializar os
métodos herdados das superclasses, alterando o seumétodos herdados das superclasses, alterando o seu
comportamento nas subclasses por um mais específico.
• A sobrescrita de métodos consiste basicamente em criar
um novo método na classe filha contendo a mesma
assinatura e mesmo tipo de retorno do método
sobrescrito.
Polimorfismo
Sobrecarga (overloading)
• Metodos sobrecarregados tem uma diferença básica dos
métodos sobrescritos: Sua lista de argumentos DEVE ser
alterada.
• Por este motivo, os métodos sobrecarregados permitem
que se utilize o mesmo nome do método numa mesmaque se utilize o mesmo nome do método numa mesma
classe ou subclasse e isto pode ser usado para dar mais
opções a quem for chamar o método.
• Diferente dos métodos sobrescritos, os sobrecarregados
podem mudar o tipo de retorno e o modificador de acesso
sem restrições.

Mais conteúdos dessa disciplina