Sobrecarga, Sobreposição e Polimorfismo José Gustavo de Souza Paiva Sobrecarga de Métodos Numa mesma classe, dois ou mais métodos podem ter o mesmo nome Desde que tenham tipos, quantidade e/ou ordem de parâmetros diferentes Assinatura de um método Nome Tipo dos parâmetros 1
Sobrecarga de Métodos Sobrecarga de Métodos Erro! 2
Sobrecarga de Métodos Exemplo útil: Classe que gerencia uma lista de Objetos do tipo Cliente Atributos: nome, cpf, matricula, idade Operações Busca por nome Busca por cpf Busca por matricula Sobreposição de Métodos 3
Sobreposição de Métodos Antropóide, Macaco e Ser Humano respiram do mesmo jeito Método Respira( ) de Antropóide é utilizado para os objetos da classe Homem e Macaco, da mesma maneira, já que Macaco e Ser Humano herdam esse método Mamíferos andam de formas diferentes Um método Anda( ) em Mamífero não serve para Antropóide e Elefante, por exemplo Sobreposição de Métodos Métodos definidos na superclasse podem ser redefinidos em suas subclasses Nesse caso, a prioridade na definição é sempre a da subclasse Isso permite flexibilidade na definição de comportamentos gerais e específicos em uma hierarquia Permite também um melhor reuso de classes já prontas 8 4
Sobreposição de Métodos Antropóide, Macaco e Ser Humano respiram do mesmo jeito Método Respira( ) de Antropóide será utilizado para os objetos da classe Homem e Macaco, da mesma maneira Mamíferos andam de formas diferentes Um método Anda( ) em Mamífero provavelmente terá que ser redefinido para Antropóide e Elefante, por exemplo Sobreposição de Métodos Restrições Método que sobrepõe não deve restringir o grau de acessibilidade do método sobreposto Um método protected não pode ser sobreposto por outro private Assinaturas dos métodos devem ser idênticas Valor de retorno pode variar 5
Sobreposição de Métodos 11 Sobreposição Exemplo Java public class Pessoa { protected String nome, CPF, RG; protected int idade; public Pessoa(String n, String cpf, String rg, int id) { nome = n; CPF = cpf; RG = rg; idade = id; 12 6
Sobreposição Exemplo Java public class Funcionario extends Pessoa { protected int matricula; protected float salariobase; public Funcionario(String n, String CPF, String RG, int idade,int mat) { super(n,cpf,rg,idade); matricula = mat; salariobase = 1000; public float calculasalario() { return salariobase; 13 Sobreposição Exemplo Java public class Piloto extends Funcionario { private int numhoras; public Piloto(String n, String CPF, String RG, int idade, int mat, int nh) { super(n,cpf,rg,idade,mat); numhoras = nh; public float calculasalario() { return (salariobase + numhoras*4); 14 7
Sobreposição Exemplo Java public class Atendente extends Funcionario { private float comissao; private int numvendas; public Atendente(String n, String CPF, String RG, int idade, int mat) { super(n,cpf,rg,idade,mat); comissao = 0.45f; numvendas = 0; public void computavenda() { numvendas++; public float calculasalario() { return (salariobase + numvendas*comissao); 15 Sobreposição de Métodos 8
Sobreposição de Métodos Os métodos print() das classes CD e DVD terão prioridade ao método print() da classe Item No entanto, os métodos da superclasse não são automaticamente chamados, como ocorre com os construtores Para execução em forma cascata, como proceder? Sobreposição de Métodos Os métodos print() das classes CD e DVD terão prioridade ao método print() da classe Item No entanto, os métodos da superclasse não são automaticamente chamados, como ocorre com os construtores Para execução em forma cascata, como proceder? Utilização do super chamando o método da superclasse 9
Problema Criar um vetor de funcionários Vetor deve abranger atendentes e pilotos Como ficaria a declaração do vetor? Vetores só podem conter um tipo de dado Problema Criar um vetor de funcionários Vetor deve abranger atendentes e pilotos Como ficaria a declaração do vetor? Vetores só podem conter um tipo de dado Solução: criar um vetor para funcionário, um para piloto e outro para atendente Solução ruim! 10
Polimorfismo Polimorfismo: várias formas o alvo (executor) de um método pode ter várias formas (classes) Quem chama um método (envia uma mensagem) em um objeto não precisa saber a que classe esse objeto pertence Programar no geral ao invés de programar no específico Polimorfismo Necessário na chamada: saber que esse objeto pode realizar essa operação (comportamento) Não é necessário saber nem a classe do objeto nem como essa operação é implementada É possível até trocar o objeto que implementa a operação sem avisar os usuários de seus métodos 11
Polimorfismo Objetos respondem de maneiras diferentes à mesma mensagem, dependendo da classe a qual pertencem Representam tipos dinâmicos de variáveis Mesma mensagem, enviada a uma variedade de objetos, tem muitas formas de processamento Recurso importante aliado à herança Objetos que compartilham a mesma superclasse em uma hierarquia de classes podem ser tratados como se fossem objetos da superclasse 23 Polimorfismo O polimorfismo ocorre quando um programa invoca um método por meio de uma variável da superclasse e em tempo de execução, a versão correta da subclasse do método é chamada O mesmo nome e assinatura de método podem ser utilizados para fazer com que diferentes ações ocorram Em Java, todas as variáveis de objeto utilizam polimorfismo Um objeto de uma classe A pode se referir a A ou a qualquer classe que seja descendente de A 24 12
Polimorfismo Exemplo programa para simulação do movimento de vários tipos de animais Criação da classe Animal Criação das classes Peixe, Anfíbio e Pássaro que estendem a classe Animal Todas contém o método mover() Cada subclasse implementa um método mover() de maneira diferente Cada objeto saberá como executar adequadamente quando mover() for invocado 25 Polimorfismo Vantagens Flexibilidade na definição e gerenciamento do conjunto de classes em uma hierarquia O programador não precisa verificar qual a natureza do objeto para saber qual método invocar Basta que ele participe da hierarquia Facilidade na criação e manipulação de estruturas de dados heterogêneas Projeto e implementação de sistemas facilmente extensíveis 26 13
Polimorfismo Exemplo em Java É possível criar uma estrutura que represente o conjunto de funcionários da empresa Utilizando um array Funcionario[] qe = new Funcionario[5]; qe[0] = new Piloto( Rui, 123, 344,30,225,300); qe[1] = new Atendente( Joe, 125, 345,26,226); qe[2] = new Funcionario( Ana, 237, 375,47,227); qe[3] = new Piloto( Pat, 587, 366,54,228,4500); qe[4] = new Atendente( Ben, 799, 533,25,229); 27 Polimorfismo Exemplo em Java Para calcular o salário de todos os funcionários for (int i=0;i<qe.length;i++) System.out.println(qE[i].calculaSalario()); 28 14
Polimorfismo instanceof Em alguns casos, é necessário descobrir a classe à qual o objeto pertence (ao invés de tratá-lo como um objeto de sua superclasse) Para isso, utiliza-se o comando instanceof Exemplo: contar o número de pilotos int cp = 0; for (int i=0;i<qe.length;i++) if (qe[i] instanceof Piloto) cp++; System.out.println( Num Pilotos: +cp); 29 Problema 15
Problema Figura[] v = new Figura[2]; v[0] = new Retangulo(); v[1] = new Circulo(); v[1].getraio(); ERRO, mesmo sabendo que a classe Circulo contém esse método Casting As vezes é necessário executar operações específicas em uma subclasse, que está referenciada como sua superclasse (polimorfismo) Casting permite a atribuição da subclasse para a superclasse IMPORTANTE: Não é possível atribuir a superclasse para subclasse! 16
Casting Exemplo Figura[] v = new Figura[2]; v[0] = new Retangulo(); v[1] = new Circulo(); v[1].getraio(); ERRO, mesmo sabendo que a classe Circulo contém esse método Casting corrige isso: ((Circulo)v[1]).getRaio(); Casting ArrayList lista = new ArrayList(); lista.add("alo"); String elemento = lista.get(0); erro! Com Casting String elemento = (String)lista.get(0); 17
Resumindo Herança reaproveitamento de atributos e métodos de classes em outras classes, criando uma hierarquia Generalização especialização Reutilização de código Construção de softwares de maneira mais rápida, mais segura, mais extensiva e de melhor manutenção 35 Resumindo Polimorfismo propriedade pela qual mensagens podem significar coisas diferentes, dependendo do objeto que a recebe Manipulação de diversas subclasses através de operações definidas na superclasse Possibilidade de manipulação de estruturas heterogêneas Tais recursos são importantes e diferenciam as linguagens Orientadas a Objetos de linguagens que envolvem o paradigma estruturado 36 18
Exercício Implemente uma hierarquia de formas geométricas, de acordo com a Figura do próximo slide Cada forma bidimensional deve conter o método obterarea(), e cada forma tridimensional deve conter o método obterarea() e obtervolume() Crie um programa que utilize um vetor de formas para objetos dessa hierarquia Crie métodos para mostrar uma descrição textual do objeto ao qual cada elemento se refere O programa também deve percorrer o vetor e, se for uma forma bidimensional, mostrar sua área, e se for uma forma tridimensional, mostrar seu volume 37 Exercício 19
Áreas Circunferência: πr 2 Quadrado: L 2 Triângulo: B*H Esfera: 4πR 2 Cubo: 6L 2 Tetraedro: L 2 3 Volumes Esfera: (4/3)πR 3 Cubo: L 3 Tetraedro: (1/3)A base *H Fórmulas Referências DEITEL, H. M., DEITEL, P. J., Java: Como Programar, Bookman, São Paulo, 2002 BARNES, D. J., KOLLING, M., Programação Orientada a Objetos com Java, 2004, ISBN: 8576050129 Casagrande, L. M., Slides de Programação Orientada a Objetos - Sobrecarga e Sobreposição de Métodos, disponivel em http://www.slideshare.net/ludimila_monjardim/po o-19sobrecarga-sobreposio Moreira, D., Conceitos básicos em POO, disponível em http://java.icmc.usp.br/drupal6/web-courses 20