Post on 24-May-2015
© 2
01
2 Iv
an L
. M. R
icar
te
1
Programação orientada a objetos: herança
Prof. Dr. Ivan Luiz Marques Ricarte
© 2
01
2 Iv
an L
. M. R
icar
te
2
Considerações iniciais sobre o ensino da programação orientada a objetos
Enfatizar, desde o início, o ensino da
programação voltada para as boas
práticas, fundamentadas em ocultar
e encapsular os dados que
representam um item de
informação.
htt
p:/
/in
gen
ieri
ain
form
atic
a.in
fo/
© 2
01
2 Iv
an L
. M. R
icar
te
3
Considerações iniciais sobre o ensino da programação orientada a objetos
Fazer com que o aluno realize, por meio da programação
orientada a objetos, o Princípio de Eric S. Raymond:
htt
p:/
/lw
n.n
et/2
00
0/f
eatu
res/
ESR
/
Smart data structures and dumb
code works a lot better than the other
way around.
© 2
01
2 Iv
an L
. M. R
icar
te
4
Objetivos
Entender o que é herança.
Relacionar herança com os conceitos da programação orientada
a objetos previamente estudados.
Conhecer os mecanismos da linguagem de programação C++
para a realização da herança.
Estabelecer as bases para a apresentação do conteúdo da
programação genérica (polimorfismo) em C++.
© 2
01
2 Iv
an L
. M. R
icar
te
5
CONCEITOS PRELIMINARES
© 2
01
2 Iv
an L
. M. R
icar
te
6
Encapsulação
“Ato de encapsular, rodear de uma cápsula.”
http://magistralfarma.blogspot.com.br/2011/04/farmacia-de-manipulacao-por-onde.html
Cápsula: estojo.
© 2
01
2 Iv
an L
. M. R
icar
te
7
Encapsulação em C++
Definição de uma classe:
• Congrega atributos e métodos (funções membro).
• Tratados como uma unidade (objeto).
dia: 5
mes: 10
ano: 2012
Data hoje(5,10,2012);
© 2
01
2 Iv
an L
. M. R
icar
te
8
Ocultação
“Ato ou efeito de ocultar.”
htt
p:/
/co
rco
dilo
s.co
m/
Ocultar: não deixar ver ou não
contar; encobrir; esconder.
© 2
01
2 Iv
an L
. M. R
icar
te
9
Ocultação em C++
Especificadores de escopo:
• private para atributos.
• public para métodos da
interface pública.
© 2
01
2 Iv
an L
. M. R
icar
te
10
Composição
“O que resulta da reunião das partes componentes; todo.”
http://www.odec.ca/projects/2006/stag6m2 http://www.circuitstoday.com/
http://www.westfloridacomponents.com/ http://www.shopdatacenter.com/computer-hardware/
http://news.thomasnet.com/
© 2
01
2 Iv
an L
. M. R
icar
te
11
Composição em C++
Classes existentes utilizadas para definir novas classes:
© 2
01
2 Iv
an L
. M. R
icar
te
12
Os pilares da programação orientada a objetos
Composição
Encapsulação
Ocultação htt
p:/
/ges
tao
eevo
luca
o.b
logs
po
t.co
m.b
r
© 2
01
2 Iv
an L
. M. R
icar
te
13
HERANÇA
O pilar que completa a programação orientada a objetos
© 2
01
2 Iv
an L
. M. R
icar
te
14
O que é herança?
“Em programação orientada a objetos, ação de passar as
características de uma classe ou tipo de dado para outro,
chamada de descendente.”
“Herança: Uma classe pode ser derivada de outra classe, que é
chamada de classe básica da classe derivada. A classe derivada
herda as propriedades de suas classes básicas, inclusive seus
membros de dados e suas funções membros.”
Michaelis Moderno Dicionário da Língua Portuguesa
Margaret Ellis e Bjarne Stroustrup.
© 2
01
2 Iv
an L
. M. R
icar
te
15
O que é herança?
“Um recurso das linguagens de programação orientadas a objetos com
o qual classes podem ser especializadas, a partir de superclasses mais
gerais. Os atributos e as definições de métodos das superclasses são
automaticamente adquiridos por uma subclasse.”
“Herança é um princípio de orientação a objetos, que permite que
classes compartilhem atributos e métodos, através de "heranças". Ela
é usada na intenção de reaproveitar código ou comportamento
generalizado ou especializar operações ou atributos.”
Craig Larman
Wikipedia
© 2
01
2 Iv
an L
. M. R
icar
te
16
Em resumo, herança é...
Uma característica única da programação orientada a objetos.
Principal diferencial deste paradigma de programação em
relação a outros.
Permite definir uma nova classe a partir de outra já existente:
• Classe existente: Base
• Nova classe: Derivada
© 2
01
2 Iv
an L
. M. R
icar
te
17
Como usar herança?
Herança não é simplesmente um mecanismo de reuso de código.
• Composição atende bem a essa necessidade.
Herança é um mecanismo de abstração.
• Possibilita a programação genérica (polimórfica).
© 2
01
2 Iv
an L
. M. R
icar
te
18
Como usar herança?
“Certamente, é com a herança que você irá repensar
radicalmente sua abordagem de construir sistemas de software.
[Mas] não saber distinguir os distintos significados associados
aos mecanismos de herança já causou dores incalculáveis a
muitos programadores C++.”
É preciso conhecer bem os recursos associados da linguagem de programação para evitar problemas na
implementação de sistemas.
Scott Meyers
© 2
01
2 Iv
an L
. M. R
icar
te
19
DECLARAÇÃO DE CLASSES DERIVADAS
Herança em C++
© 2
01
2 Iv
an L
. M. R
icar
te
20
Como declarar uma classe derivada em C++
class Derivada : public Base {
...
};
Base
Base b; Derivada d;
Base
Derivada
© 2
01
2 Iv
an L
. M. R
icar
te
21
Estrutura da classe derivada
Todos os atributos que são membros da classe base também
fazem parte da classe derivada.
Pessoa p:
Aluno a:
nome_
nome_
ra_
© 2
01
2 Iv
an L
. M. R
icar
te
22
Restrições de acesso na classe derivada
No entanto, restrições de visibilidade são preservadas:
Como definir e manipular essa parte da informação no objeto da
classe derivada?
nome_ é private de Pessoa!
© 2
01
2 Iv
an L
. M. R
icar
te
23
Construção de objetos da classe derivada
Construtor da classe base é invocado primeiro, depois o da
classe derivada é executado.
Se construtor da classe base demanda argumentos, estes podem
ser indicados na especificação do construtor da classe derivada:
© 2
01
2 Iv
an L
. M. R
icar
te
24
O especificador protected
Os especificadores de acesso a membros da classe:
• private: acesso exclusivo a funções membros da própria classe.
• public: acesso permitido a qualquer função.
• protected: acesso permitido apenas a classes derivadas.
© 2
01
2 Iv
an L
. M. R
icar
te
25
Como usar protected
Se objeto da classe derivada precisa
manipular atributos definidos na
classe base, esses atributos podem ser
declarados na base como protected.
Mas isso viola o princípio da ocultação
da informação.
protected não deve ser utilizado dessa maneira!
© 2
01
2 Iv
an L
. M. R
icar
te
26
Uso recomendado de protected
Classe base define um conjunto de funções membro com
visibilidade protected para uso apenas nas classes derivadas:
© 2
01
2 Iv
an L
. M. R
icar
te
27
A HERANÇA DO COMPORTAMENTO
Herança em C++
© 2
01
2 Iv
an L
. M. R
icar
te
28
Qual comportamento é herdado na classe derivada?
Na herança pública, métodos públicos da classe base são também
métodos públicos na classe derivada:
Padrão: assinatura, especificação e implementação são herdadas.
Método definido na classe base Saída: Ivan
© 2
01
2 Iv
an L
. M. R
icar
te
29
Extensão
Classe derivada pode incluir novos métodos, não presentes na
interface operacional da classe base:
Interface pública de Aluno inclui string nome() [de Pessoa] e int obtemRA() [de Aluno]
© 2
01
2 Iv
an L
. M. R
icar
te
30
Redefinição
Classe derivada pode alterar (especializar) a implementação de um
método especificado na classe base, com a mesma assinatura:
Saída: Academico Ivan
© 2
01
2 Iv
an L
. M. R
icar
te
31
Princípios de herança: sumário
Estrutura:
• Ocultação da informação deve ser preservada.
Comportamento (público):
• Método da classe base pode ser integralmente aproveitado
(interface, especificação e implementação).
• Novos métodos podem ser agregados (extensão).
• Implementação de método da classe base pode ser alterada
(redefinição).
– Base para a programação genérica.
© 2
01
2 Iv
an L
. M. R
icar
te
32
RECURSOS PARA A PROGRAMAÇÃO GENÉRICA
Herança em C++
© 2
01
2 Iv
an L
. M. R
icar
te
33
Motivação
Interesse em tratar objetos de
modo genérico, sem conhecer
seu tipo específico.
Exemplo: Conjunto de Pessoas.
© 2
01
2 Iv
an L
. M. R
icar
te
34
Princípio da Substituição de Liskov
Um objeto da classe derivada pode
substituir um objeto da classe base sem
alterar as propriedades desejáveis de um
programa (tarefa executada, correção).
htt
p:/
/ru
.wik
iped
ia.o
rg/w
iki/
© 2
01
2 Iv
an L
. M. R
icar
te
35
Declaração das classes
© 2
01
2 Iv
an L
. M. R
icar
te
36
Exemplo de execução (sem polimorfismo)
Saída: Lara Academico Pedro Professor Ivan
© 2
01
2 Iv
an L
. M. R
icar
te
37
Tentativa de tratar objetos genericamente
Saída: Lara Pedro Ivan
© 2
01
2 Iv
an L
. M. R
icar
te
38
Por que falhou?
Um método que é definido em uma classe sem o especificador
virtual não pode ser redefinido em classes derivadas
Se redefinição é permitida, método deve ser declarado como virtual
© 2
01
2 Iv
an L
. M. R
icar
te
39
Método virtual
Saída: Lara Academico Pedro Professor Ivan
© 2
01
2 Iv
an L
. M. R
icar
te
40
Porque destrutores devem ser declarados como virtuais
Pessoa p: Aluno a: nome_ nome_
ra_
Pessoa *p = new Aluno(...); ... delete p; Se os destrutor em Pessoa não for declarado
como virtual, apenas a implementação da classe base (Pessoa) será executada.
Vazamento de memória
© 2
01
2 Iv
an L
. M. R
icar
te
41
Herança e os diferentes tipos de métodos públicos
Método simples (sem o especificador virtual):
• Classe derivada não pode redefinir o método – deve preservar a
assinatura, especificação e implementação.
• Comportamento invariante.
Método virtual:
• Classe derivada pode redefinir o método ou utilizar a
implementação padrão.
Método virtual puro:
• Classe derivada deve redefinir o método, não há
implementação padrão.
virtual string nome() = 0;
© 2
01
2 Iv
an L
. M. R
icar
te
42
PRÓXIMOS PASSOS
Programação orientada a objetos em C++
© 2
01
2 Iv
an L
. M. R
icar
te
43
Próximos passos
Explorando o polimorfismo com funções virtuais:
• Não mais repetir “if-else’s” nos métodos de uma classe.
• Não mais repetir trechos de código em métodos de diferentes classes.
Especificação sem implementação:
• Funções virtuais puras, classes abstratas e classes abstratas puras.
• Objetivo: programar pelo contrato, não pela implementação.
Gabaritos (Templates):
• Outro mecanismo para programação genérica, diferente de herança.
• Tipo do objeto não modifica o comportamento.
© 2
01
2 Iv
an L
. M. R
icar
te
44
Leituras adicionais
Item 35 (herança pública modela “é-um”) Item 37 (redefinir função não virtual) Item 44 (entender os significados em herança)
Capítulo 12 Classes derivadas
Capítulo 12 Programação orientada a objetos: herança
© 2
01
2 Iv
an L
. M. R
icar
te
45
Ivan Luiz Marques Ricarte ricarte@unicamp.br