Você está na página 1de 23

Polimorfismo em JavaTM

por Jorge H C Fernandes


(jhcf@di.ufpe.br)
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  todos os soquetes tem a
 caixa de porcas de mesma interface
mesmo tamanho = classe (assinatura de método)
 soquete = método com a chave de torção
(método polimótfico)
 cada soquete (método)
se aplica a uma única  cada soquete (método)
caixa de porca (classe) tem um acoplador
(implementação de
 torçer a chave = método méotodo) diferente que
polimórfico 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 Porca
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 Contra-


Ataca
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 Parafuso

Porca10mm Porca8mm Parafuso8mm


Parafuso10mm
Porca12mm Parafuso12mm

Java e Modelo de Objetos. Copyright © 1999, by Jorge H. C. Fernandes. Todos os Direitos Reservados.
Parafuso é uma Porca?

Porca

Porca10mm Porca8mm
Parafuso
Porca12mm
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 abstract class Roscável {
abstract void acopleETorca();
}

Porca Parafuso

Parafuso8mm
Porca10mm Porca8mm Parafuso10mm
Porca12mm Parafuso12mm

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


Porca12mm Parafuso12mm

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 Oxidável
Roscável

Rebite Parafuso Esfera


Porca

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 { interface Oxidável {


void acopleETorca(); 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.

Você também pode gostar