Polimorfismo em Javajhcf/MyBooks/itjava/slides/... · Problemas com Herança Múltipla são...
Transcript of Polimorfismo em Javajhcf/MyBooks/itjava/slides/... · Problemas com Herança Múltipla são...
Polimorfismo em JavaTM
por Jorge H C Fernandes([email protected])CESAR-DI-UFPERecife, 1999
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
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órficapara 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 de porca para cada tamanho de porca diferente
�Cada classe deve fornecer sua implementação específica para o método acopleETorca.
Porca
Porca10mm
Porca12mm
Porca8mm
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 (...) ...}
}
Interfaces: Solucionando Problemas na Evolução de Código Polimórfico
O Kit de Soquetes Contra-Ataca
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
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?
Porca
Porca10mmPorca12mm
Porca8mm Parafuso8mm
Parafuso
Parafuso10mmParafuso12mm
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.
Parafuso é uma Porca?
Porca
Porca10mmPorca12mm
Porca8mm
Parafuso8mm
Parafuso
Parafuso10mmParafuso12mm
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Porcas e Parafusos são Primos?
Porca
Porca10mmPorca12mm
Porca8mm
Parafuso8mm
Parafuso
Parafuso10mmParafuso12mm
Roscável abstract class Roscável {abstract void acopleETorca();
}
Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Reescrevendo o Cliente do Método Polimórficoclass 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?
Porca
Porca10mmPorca12mm
Porca8mm
Parafuso8mm
Parafuso
Parafuso10mmParafuso12mm
RoscávelReciclável Oxidável
ItemEstoque
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
Porca Parafuso
RoscávelReciclável Oxidável
ItemEstoque
Rebite Esfera
Interfaces
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 Interfacesabstract 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() {..}
}