Você está na página 1de 25

HERANÇA E

POLIMORFISMO
HERANÇA E POLIMORFISMO
Herança

 A Herançaé a contribuição original do paradigma de


programação orientado a objetos
 Fundamentos chave do paradigma OO:
 Abstração de Dados
 Herança

 Ligação Dinâmica
 A herança é um relacionamento entre classes
 Relacionamento do tipo é um
Herança

 Forma de reutilização de código


 Propriedades e métodos são herdados, evitando sua duplicação
em várias classes similares
 Forma de generalização/especialização de tipos
 Várias classes podem ser generalizadas em uma classe que
concentre todas as características comuns a todas elas
 Uma classe pode ser especializada em várias outras classes
 Pelo menos duas classes participam da herança
Herança

 Papéis das classes que participam da herança:


 Superclasse: classe a partir da qual são herdadas as propriedades e
métodos
 Subclasse: classe que herda as propriedades e métodos da
superclasse
 Se uma classe herda de outra, então:
 Os objetos da subclasse possuem todas as propriedades de instância
declaradas na superclasse
 Pode-se enviar para um objeto da subclasse uma mensagem cuja
implementação esteja na superclasse
Herança

 Exemplos de relacionamentos de herança no mundo real:


 Um carro é um veículo
 Um gerente é um funcionário
 Um homem é um mamífero
 Um mamífero é um animal
 Na POO a herança não é um relacionamento entre objetos,
mas entre as classes destes objetos
 No mundo real, a herança algumas vezes é uma relação entre
seres (o filho herda dos pais)
Herança na UML
Figura
-pos: Ponto
Especialização +setPos()

Quadrado Triangulo Circulo


-lado: int -base: int -raio: int
+draw() -altura:int +draw()
+draw()
Generalização
Herança

 Declaração de herança em Java:


public class Figura {
private Ponto pos;

public void setPos(Ponto p) { ... }


}

palavra reservada de Java

public class Quadrado extends Figura {


private int lado;

public void draw() { ... }


}
Herança

 Efeito da herança sobre os objetos da subclasse:

Figura f = new Figura();


Quadrado q = new Quadrado();

f.setPos(new Ponto(10,20)); Operações


q.setPos(new Ponto(30,40)); perfeitamente
q.draw(); válidas
Herança

 Herdando o estado:
 Todos os objetos da subclasse terão uma cópia das variáveis de
instância declaradas em todas as suas superclasses
 Herdando o comportamento:
 Todos os métodos de instância da superclasse também são
métodos dos objetos das suas subclasses
 Ao enviar uma mensagem para um objeto da subclasse, a busca
por um método começa na subclasse e se estende pelas
superclasses
Herança em Java

 Observe que:
 O encapsulamento private não impede que uma propriedade
ou método seja herdado; entretanto, o acesso a estes membros é
impedido na subclasse
 O nível de acesso protected permite que membros sejam
invisíveis a outras classes, mas sejam visíveis às subclasses e às
classes do mesmo pacote
 Java possui uma classe Object que é a raiz da árvore de classes
da linguagem (não tem superclasse)
 Java só permite herança simples (apenas uma superclasse)
Herança

 Sobrescrita de métodos
 Se uma subclasse implementa um método que já exista na
superclasse dizemos que houve uma sobrescrita de método
(override)
 Os métodos devem possuir a mesma assinatura
 A busca pelo método inicia-se e termina na subclasse
 O método sobrescrito pode chamar o método original da superclasse
na sua implementação: super
 Neste caso, se a visibilidade o permitir
 Não confunda esse conceito com sobrecarga
Herança
Venda
 Exemplo de sobrescrita: -data: Date
+getData(): Date Produto
0..n
+addProduto(Produ -preço: real
to) -descriçao: String
+getTotal(): real
+getValor()
+setValor(double)

VendaPrazo VendaVista
-juros: int -desconto: int
+getTotal() +getTotal()
Herança
 Implementação de Venda em Java

public class Venda {


private Produto produtos[];
private int numProdutos;
private Date data;

//Calcula o total bruto da conta


public double getTotal() {
double total = 0.0;
for (int i=0; i<numProdutos ;i++) {
total += produtos[i].getPreco();
}
return total;
}
}
Herança
 Implementação de VendaPrazo em Java:

public class VendaPrazo extends Venda {


private int juros;

public double getTotal() {


return super.getTotal()*(1+juros/100.0);
}
}

 A referência super aponta para o objeto corrente, mas faz a busca pelo método
getTotal() começar na superclasse de VendaPrazo
 Sem o super, a chamada seria recursiva!
Ligação Dinâmica e Herança

 Uma mensagem só é ligada a um método em tempo de


execução  ligação dinâmica
 Na ligação estática, a ligação entre a chamada de um subprograma
e sua implementação é estabelecida em tempo de compilação
 Com a herança, não se sabe exatamente qual o método a ser
invocado até que se conheça o tipo real do objeto (tipo
dinâmico).
 Durante a compilação só temos o tipo das referências (tipo
estático)
Ligação Dinâmica

 Considere o seguinte código:


public class Caixa {
private Venda vendas[];
private int numVendas;

//Calcula o total do caixa


public double getTotal() {
double total = 0.0;
for (int i=0; i<numVendas ;i++) {
total += vendas[i].getTotal();
}
return total;
}
}
Ligação Dinâmica
 Observe o código do getTotal() de Caixa:

public class Caixa {


public double getTotal() {
double total = 0.0;
for (int i=0; i<numVendas ;i++) {
total += vendas[i].getTotal();
}
return total; Qual getTotal() será chamado aqui?
}
} VendaPrazo VendaVista
-juros: int -desconto: int
+getTotal() +getTotal()
Ligação Dinâmica

 A ligação entre a mensagem vendas[i].getTotal() e o


método getTotal() de uma das classes só é
estabelecida em tempo de execução, quando o tipo
do objeto em vendas[i] for conhecido
 Venda é o tipo de cada referência do arranjo vendas
 VendaVista e VendaPrazo serão os tipos efetivos dos
objetos referenciados pelo arranjo
 Exemplo:
tipo estático tipo dinâmico
Venda v = new VendaVista();
Polimorfismo
 Polimorfismo
 Do Grego poly(muitas) + morpho(formas)
 Há dois aspectos do polimorfismo
 Métodos de mesmo nome são definidos em várias classes,
podendo assumir diferentes implementações em cada uma dessas
 Propriedade pela qual uma variável pode apontar objetos de
diferentes classes em momentos distintos
 Estes aspectos são complementares, e trabalham juntos
Polimorfismo

 Exemplo do polimorfismo em métodos:


Polimorfismo
 Exemplo de polimorfismo em variáveis:
 Uma variável do tipo Poligono pode assumir a forma de
Poligono, Triangulo,
Poligono p;Retangulo, etc.

p = new Poligono();
...
p = new Triangulo();
...
p = new Retangulo();
Exemplo de uso de Polimorfismo
 Área de um arranjo de polígonos (sem polimorfismo):
double areaTotal() {
double areaTotal = 0;
for (int i = 0; i < MAXPOLIG; ++i) {
if (pol[i] instanceof Poligono)
areaTotal +=
pol[i].areaPoligono();
else if (pol[i] instanceof Triangulo
Triangulo)
areaTotal +=
pol[i].areaTriangulo();

continua
Exemplo de uso de Polimorfismo

 Área total sem polimorfismo:

else if (pol[i] instanceof Retangulo


Retangulo)
areaTotal +=
pol[i].areaRetangulo();
else if (pol[i] instanceof Hexagono
Hexagono)
areaTotal +=
pol[i].areaHexagono();
return areaTotal;
}
Exemplo de uso de Polimorfismo
 Área total com polimorfismo
double areaTotal() {
double areaTotal = 0;
for (int i = 0; i < MAXPOLIG; ++I)
areaTotal += poligono[i].area();
return areaTotal;
}

 Rápido, enxuto e fácil de entender


 O acréscimo de uma nova subclasse de Poligono não altera nenhuma linha do
código acima!
Benefícios do polimorfismo

 Legibilidade do código
O mesmo nome para a mesma operação (método) facilita o
aprendizado e melhora a legibilidade
 Código de menor tamanho
 Código mais claro, enxuto e elegante.
 Flexibilidade
 Pode-se incluir novas classes sem alterar o código que a
manipulará
O polimorfismo é implementado com o uso
da ligação dinâmica

Você também pode gostar