Polimorfismo em JavaTM
por Jorge H C Fernandes (
[email protected]) CESAR-DI-UFPE Recife, 1999
Polimorfismo Técnica para criação de código adaptável a mudanças, o que reduz o esforço de manutenção de código Baseia-se na separação entre a interface e a implementação de métodos, e no uso de herança
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Ferramentas Convencionais
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Um Kit de Soquetes
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Polimorfismo e o Kit de Soquetes Usando ferramentas convencionais Vantagens do Kit de Soquetes Uma definição polimórfica para o “Kit” Uma interpretação orientada a objetos para o “Kit” Uma implementação em Java do “Kit” Avaliando o impacto de alterações no “Kit”
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Uma Definição Polimórfica para o “Kit” O ato de girar uma chave de torção acoplada a um soquete pode ser usado em várias situações distintas Todos os soquetes tem uma mesma interface com a chave, que neste caso é um orifício quadrado Sem conhecimento da chave de torção, cada soquete tem um acoplador especial, adaptado a porcas de tamanho diferente Para usar a mesma chave e método de torção ao se criar um novo formato de porca é preciso apenas criar um novo soquete Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Uma Interpretação Orientada a Objetos para o “Kit” porca = objeto caixa de porcas de mesmo tamanho = classe soquete = método cada soquete (método) se aplica a uma única caixa de porca (classe) torçer a chave = método polimórfico
todos os soquetes tem a mesma interface (assinatura de método) com a chave de torção (método polimótfico) cada soquete (método) tem um acoplador (implementação de méotodo) diferente que se adapta a uma classe de porcas
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Uma Implementação em Java do “Kit de Soquetes” (1) Criar uma classe (abstrata) chamada Porca, para agrupar todas as classes de porca. abstract class Porca { int faces; /* Método abstrato (sem implementação) */ abstract void acopleETorca(); }
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Uma Implementação em Java do “Kit de Soquetes” (2) Uma classe chamada ChaveDeTorcao, que implementa um método polimórfico. class ChaveDeTorcao { /* Aperta qualquer porca */ void aperte(Porca porca) { porca.acopleETorca(); } } Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Uma Implementação em Java do “Kit de Soquetes” (3) Criar uma subclasse Porca de porca para cada tamanho de porca diferente Cada classe deve Porca10mm Porca8mm fornecer sua Porca12mm implementação específica para o método acopleETorca. Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Uma Implementação em Java do “Kit de Soquetes” (4) class Porca8mm extends Porca { void acopleETorca(){ if (...) ... } } class Porca10mm extends Porca { void acopleETorca(){ for (...) ... } } Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Interfaces: Solucionando Problemas na Evolução de Código Polimórfico
O Kit de Soquetes ContraAtaca
Novos Usos para o “Kit”: Apertando Parafusos
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Onde Colocar os Parafusos? class ChaveDeTorcao { /* Aperta qualquer porca */ void aperte(Porca porca) { porca.acopleETorca(); } }
Porca
Porca10mm
Porca8mm Porca12mm
Parafuso
Parafuso8mm
Parafuso10mm Parafuso12mm
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Parafuso é uma Porca? Porca
Porca10mm
Porca8mm Porca12mm
Parafuso Parafuso8mm
Parafuso10mm Parafuso12mm
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Porcas e Parafusos são Primos? Roscável
Porca
abstract class Roscável { abstract void acopleETorca(); }
Parafuso Parafuso8mm
Porca10mm
Porca8mm Parafuso10mm Parafuso12mm Porca12mm
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Reescrevendo o Cliente do Método Polimórfico class ChaveDeTorcao { /* Aperta qualquer porca */ void aperte(Porca porca) { porca.acopleETorca(); } } class ChaveDeTorcao { /* Aperta qualquer roscável */ void aperte(Roscável r) { r.acopleETorca(); } } Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Que Outros Parentescos? ItemEstoque Reciclável
Oxidável Roscável
Porca
Parafuso Parafuso8mm
Porca10mm
Porca8mm Parafuso10mm Parafuso12mm Porca12mm
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Problemas com Herança Múltipla são solucionados em Java através do uso de interfaces Separação entre subclasses e subtipos Classe Descreve as propriedades fundamentais de um objeto
Interface Descrevem papéis desempenhados por um objeto em determinadas situações Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Roscável (Interface ou Classe?) abstract class Roscável { abstract void acopleETorca(); } interface Roscável { void acopleETorca(); }
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classes e Interfaces ItemEstoque Interfaces Reciclável
Rebite
Porca
Roscável
Oxidável
Parafuso
Esfera
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Interfaces Roscável, Oxidável e Reciclável abstract class Roscável { abstract void acopleETorca(); } interface Roscável { void acopleETorca(); }
interface Oxidável { String índiceOxidação(); }
interface Reciclável { String categoriaReciclagem(); }
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Implementação de Interfaces abstract class Porca extends ItemEstoque implements Roscável, Oxidável, Reciclável { int faces; abstract void acopleETorca(); abstract String índiceOxidação(); String categoriaReciclagem() {return “Metal”;} } class Porca6mm extends Porca { Porca6mm() { faces = 6; } void acopleETorca() {..} String índiceOxidação() {..} }
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.