Programação Orientada a Objetos Herança e polimorfismo "O homem absurdo é aquele que nunca muda.“ - Georges Clemenceau 1. 2. 3. 4. 5. Composição, agregação, associação Herança Reescrita Sobrecarga Polimorfismo 2 Composição, Agregação e Associação • Composição – Um trem é formado por 1 locomotiva e n vagões; – Relacionamento tem-um; • Agregação – Uma locomotiva (todo) tem um farol (parte), mas não deixa de existir se não o tiver; • Associação – Um trem usa uma estrada de ferro (a estrada não faz parte do trem, mas ele depende dela). 3 Herança • Objetivo 1: reuso de código. • Praticando! (5 minutos) • Imagine o sistema de um banco... Nesse sistema precisamos armazenar dados de funcionários (que podem exercer diferentes funções, ex.: secretário ou gerente) e clientes. – Vamos modelar essa parte do sistema! 4 Herança • Relacionamento É-UM em java, instanceof 5 6 Herança • Objetivos: 1. Reuso de código; 2. Polimorfismo. • Palavras-chave: – extends: para herdar as caraterísticas de uma classe; – Instanceof: para testar relacionamentos É-UM entre objetos 7 Se não houvesse herança em Java, como você poderia reaproveitar o código de outra classe? Quais seriam as implicações dessa nova abordagem? 8 Overriding • Outros nomes: sobrescrever (overwriting), reescrever, sobrepor... • Praticando! (5 minutos) – No exemplo anterior, suponha que os funcionários, de modo geral, ganhem uma bonificação de 10%. Mas, devido o fato do gerente ter mais responsabilidade, seria justo que ele ganhasse uma bonificação de 20% de seu salário. Como nós alteraríamos o nosso modelo para satisfazer essa nova especificação? (modele/implemente apenas as classes Funcionário e Gerente) 10 Overriding 11 Overriding • Objetivo: especializar um método herdado. • Regras para sobrescrever um método: 1. A assinatura deve ser igual ou bem similar: 1. 2. 3. Lista de argumentos exatamente igual; Tipo de retorno deve ser “igual” (lembrar da relação É-UM, pois subtipos também são aceitos); Modificador de acesso pode ser menos restritivo; 2. Para haver reescrita deve, primeiramente, haver herança. Mais regras em: Livro de Certificação Java • SCJP Sun Certified Programmer for Java 6 • OCP Java SE 6 Programmer 12 Overloading • Outro nome: sobrecarregar, ... 13 Overloading • Objetivo: prover ao usuário a possibilidade de executar uma funcionalidade do sistema passando diferentes inputs (tipos de dados) • É basicamente uma outra implementação de um método já existente mas com argumentos diferentes. • Regras para sobrecarregar um método... 1. 2. 3. 4. Os métodos sobrecarregados devem alterar a lista de argumentos; Os métodos sobrecarregados podem alterar o tipo de retorno; Os métodos sobrecarregados podem alterar o modificador de acesso; Um método pode ser sobrecarregado na mesma classe ou em uma subclasse. • Também é possível sobrecarregar um construtor. Mais regras em: Livro de Certificação Java • SCJP Sun Certified Programmer for Java 6 • OCP Java SE 6 Programmer 14 Polimorfismo Polivárias morfoformas • O que guarda uma variável do tipo Funcionário? – Uma referência para um funcionário... Gerente g = new Gerente(); Funcionario f = g; f.setSalario(1000); Gerente Gerente g get/setNome() get/setIdade() get/setSalario() Senha numFuncionariosGerenciados getBonificacao() Autentica() Funcionario f 15 Polimorfismo • O que guarda uma variável do tipo Funcionário? – Uma referência para um funcionário. Gerente g = new Gerente(); Funcionario f = g; f.setSalario(1000); System.out.println(f.getBonificacao()); Gerente g Gerente get/setNome() get/setIdade() get/setSalario() Senha numFuncionariosGerenci ados getBonificacao() Autentica() Decidido em tempo de execução Funcionario f 16 Polimorfismo • Por que polimorfismo? class ControleDeBonificacoes { private double totalDeBonificacoes = 0; public void registra(Funcionario funcionario) { this.totalDeBonificacoes += funcionario.getBonificacao(); } public double getTotalDeBonificacoes() { return this.totalDeBonificacoes; } } 17 Polimorfismo • Por que polimorfismo? • O que acontece se futuramente precisarmos criar outros tipos de funcionários? ControleDeBonificacoes controle = new ControleDeBonificacoes(); Gerente funcionario1 = new Gerente(); funcionario1.setSalario(1000); controle.registra(funcionario1); Funcionario funcionario2 = new Funcionario(); funcionario2.setSalario(1000); controle.registra(funcionario2); System.out.println(controle.getTotalDeBonificacoes()); 18 Polimorfismo • Dicas sobre polimorfismo: • Não importa como nos referenciamos a um objeto, o método que será invocado é sempre o do objeto em questão. • Programe sempre pra uma superclasse! 19 Polimorfismo • Implemente o seguinte modelo: (5 minutos) 20 Polimorfismo • Crie uma classe Zoologico composta por 5 jaulas (array), onde cada uma terá um animal diferente. Depois percorra cada jaula e “cutuque o animal” (emitirSom) e, se o animal souber correr, dê uma carreira nele (correr). • (7 minutos) 21 Referências • Essa aula utilizou alguns exemplos modificados das apostilas caelum além de alguns conceitos e exemplos abordados na apostilas para certificação java (SCJP e OCJP). • Ahhh, alguns destes exemplos também saíram da minha cabeça. 22