You are on page 1of 33

Herança

Herança

 O que é herança?
Herdar é derivar características de gerações precedentes.
No mundo da Programação Orientada a Objetos, o termo é
associado com uma das formas de reutilização de software.
Através da herança, novas classes podem ser derivadas
das classes existentes. A nova classe herda propriedades e
métodos da classe base. A nova classe também pode
adicionar suas próprias propriedades e métodos
Herança

 Para que serve a herança?

Considere a criação de uma classe ClasseB em Java.

Que métodos estão disponíveis através de uma


referência para a ClasseB (isto é, um objeto)?
Herança
Herança

Suponha agora que a classe ClasseB herda de ClasseA

Que métodos estão agora disponíveis para uma


referência da ClasseB (um objeto) ?
Herança
Herança

 Poderoso mecanismo para o reaproveitamento de código

 O objeto objB tem agora disponíveis os métodos da


ClasseA sem ser necessário reescrevê-los na ClasseB

 Um objeto da ClasseB também é um objeto da ClasseA.

 Facilita a manutenção do código: Os métodos não são


replicados. Se for necessário alterar o código do método
m3, basta alterá-lo em ClasseA.

 ClasseB pode "recusar" parte da herança


reimplementando os métodos herdados
Herança

O método m3 agora
disponível para objB é
aquele implementado em
ClasseB
Herança

 Várias subclasses podem


herdar da mesma
superclasse
Herança

 Em Java, não é permitido herdar de mais de uma classe

ERRADO!!!!
Herança

 A hierarquia de herança pode ter vários níveis


Herança

 Que métodos estão


agora disponíveis para
uma instância de
ClasseC?
Herança

 A Herança também pode surgir a partir da refatoração de


classes existentes de modo a eliminar a duplicação de
código

Grande quantidade de atributos e métodos duplicados...


Herança

 Refatoração

Superclasse
(características comuns)

Subclasses
(características específicas)
Herança

O mecanismo de herança pode ser melhor entendido


através do seguinte exemplo:
Herança

 A classe ContaBancaria tem quatro atributos:


 nome: armazena o nome do cliente
 cpf: armazena o número do CPF do cliente
 numeroConta: armazena o número da conta do cliente
 saldo: armazena o saldo da conta

 Os métodos depositar e sacar são usados para fazer um


depósito ou retirada da conta bancária.

 A classe ContaBancária, sozinha, não é suficiente para


realizar todas as transações bancárias. Existem
geralmente dois tipos de contas: a conta corrente e a
conta de investimentos
Herança

Vamos derivar portanto duas subclasses que herdam da


superclasse ContaCorrente
Herança

As subclasses ContaInvestimento e ContaCorrente herdam


os atributos e métodos da classe ContaBancaria
Herança

Agora é possível fazer:

Apesar do método depositar não ter sido definido para a


classe ContaCorrente, ele está disponível devido ao
mecanismo de herança
Composição
Composição

 A classe contém referências para objetos de outras


classes
 Estas referências são também atributos da classe

 Uma maneira alternativa de estender a funcionalidade de


uma classe agregando funcionalidades de outras classes

 Herança vs. Composição


É UM vs. TEM UM
Composição

 O mecanismo de herança nem sempre é apropriado

 Java não tem herança múltipla

 Estender funcionalidade através de herança pode não ser


"natural":
 Uma conta de investimento é uma conta bancária

 Uma conta de investimento não é uma classe


DecimalFormat!
Composição

 Considere a seguinte situação:

::Project2

CA CB

m1(...) m3(...)
m2(...) m4(...)
Composição

 Considere agora que é preciso estender a funcionalidade


da classe CA oferecendo em sua interface também os
métodos m3( ) e m4( )
Composição

 1a solução: Implementar os métodos m3( ) e m4( ) na


classe CA.
::Project2

CA CB

m1(...) m3(...)
m2(...) m4(...)
m3(...)
m4(...)

 Desvantagem:
 duplicação de métodos → dificulta a manutenção do
software
Composição

 2a solução: Herança ::Project2

 Desvantagens: CB

 Conceitualmente, a m3(...)
m4(...)
classe CA pode não SER
uma classe CB

 Java não suporta herança CA

múltipla. E se fosse m1(...)


m2(...)
necessário oferecer os
serviços m5() e m6() de
uma classe CC?
Composição

 3a solução: Composição
Composição

 Que serviços estão


disponíveis para uma
referência da classe CA?
Composição

 No entanto, é possível
fazer:

 Observe a utilização dos


métodos m3 e m4
através de uma
referência para a classe
CB

 Embora possível, isso


NÃO É
RECOMENDÁVEL, pois
CB é público
Composição

 Esse processo é também conhecido por delegação: a


classe CA delega à classe CB a execução dos serviços
m3 e m4

 Observe que o atributo b na classe A é público. Diz-se


então que a delegação é pública, isto é, ela é visível para
os clientes da classe

 Um cliente da classe CA, para usar os métodos m3 e m4,


deve estar ciente da delegação e fazer:
obj.b.m3();
Composição

 É possível tornar a delegação privada:


Composição

 Oferecer os serviços m3 e m4 na classe CA não significa,


neste caso, duplicar código. Os métodos m3 e m4 em CA
são apenas uma fachada para os métodos m3 e m4 em
CB
Composição

 Que serviços estão agora disponíveis para uma


referência da classe CA?

 Observe que, agora, o cliente da classe não conhece a


delegação: para ele tudo se passa como se os métodos
m3 e m4 fossem implementados em CA

You might also like