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.