Contenu connexe
Plus de Ivan Ricarte (20)
Programação orientada a objetos: herança
- 2. Considerações iniciais sobre o ensino da
programação orientada a objetos
Enfatizar, desde o início, o ensino da
© 2012 Ivan L. M. Ricarte
programação voltada para as boas
http://ingenieriainformatica.info/
práticas, fundamentadas em ocultar
e encapsular os dados que
representam um item de
informação.
2
- 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:
© 2012 Ivan L. M. Ricarte
Smart data
structures and dumb
code works a lot
http://lwn.net/2000/features/ESR/
better than the other
way around.
3
- 4. Objetivos
Entender o que é herança.
Relacionar herança com os conceitos da programação orientada
© 2012 Ivan L. M. Ricarte
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++.
4
- 6. Encapsulação
“Ato de encapsular, rodear de uma cápsula.”
© 2012 Ivan L. M. Ricarte
Cápsula: estojo.
http://magistralfarma.blogspot.com.br/2011/04/farmacia-de-manipulacao-por-onde.html
6
- 7. Encapsulação em C++
Definição de uma classe:
• Congrega atributos e métodos (funções membro).
© 2012 Ivan L. M. Ricarte
• Tratados como uma unidade (objeto).
Data hoje(5,10,2012);
dia: 5
mes: 10
ano: 2012
7
- 8. Ocultação
“Ato ou efeito de ocultar.”
© 2012 Ivan L. M. Ricarte
http://corcodilos.com/
Ocultar: não deixar ver ou não
contar; encobrir; esconder.
8
- 9. Ocultação em C++
Especificadores de escopo:
• private para atributos.
© 2012 Ivan L. M. Ricarte
• public para métodos da
interface pública.
9
- 10. Composição
“O que resulta da reunião das partes componentes; todo.”
© 2012 Ivan L. M. Ricarte
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/ 10
- 11. Composição em C++
Classes existentes utilizadas para definir novas classes:
© 2012 Ivan L. M. Ricarte
11
- 12. Os pilares da programação orientada
a objetos
© 2012 Ivan L. M. Ricarte
http://gestaoeevolucao.blogspot.com.br
Ocultação
Composição
Encapsulação
12
- 13. © 2012 Ivan L. M. Ricarte
O pilar que completa a programação orientada a objetos
HERANÇA
13
- 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,
© 2012 Ivan L. M. Ricarte
chamada de descendente.” Michaelis Moderno Dicionário da Língua Portuguesa
“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.”
Margaret Ellis e Bjarne Stroustrup.
14
- 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
© 2012 Ivan L. M. Ricarte
gerais. Os atributos e as definições de métodos das superclasses são
automaticamente adquiridos por uma subclasse.” Craig Larman
“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.” Wikipedia
15
- 16. Em resumo, herança é...
Uma característica única da programação orientada a objetos.
© 2012 Ivan L. M. Ricarte
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
16
- 17. Como usar herança?
Herança não é simplesmente um mecanismo de reuso de código.
• Composição atende bem a essa necessidade.
© 2012 Ivan L. M. Ricarte
Herança é um mecanismo de abstração.
• Possibilita a programação genérica (polimórfica).
17
- 18. Como usar herança?
“Certamente, é com a herança que você irá repensar
radicalmente sua abordagem de construir sistemas de software.
© 2012 Ivan L. M. Ricarte
[Mas] não saber distinguir os distintos significados associados
aos mecanismos de herança já causou dores incalculáveis a
muitos programadores C++.” Scott Meyers
É preciso conhecer bem os recursos associados da
linguagem de programação para evitar problemas na
implementação de sistemas.
18
- 19. © 2012 Ivan L. M. Ricarte
Herança em C++
DECLARAÇÃO DE CLASSES DERIVADAS
19
- 20. Como declarar uma classe derivada
em C++
class Derivada : public Base {
© 2012 Ivan L. M. Ricarte
...
};
Base b; Derivada d;
Base Base
Derivada
20
- 21. Estrutura da classe derivada
Todos os atributos que são membros da classe base também
fazem parte da classe derivada.
© 2012 Ivan L. M. Ricarte
Pessoa p:
nome_
Aluno a:
nome_
ra_
21
- 22. Restrições de acesso na classe derivada
No entanto, restrições de visibilidade são preservadas:
© 2012 Ivan L. M. Ricarte
nome_ é private de Pessoa!
Como definir e manipular essa parte da informação no objeto da
classe derivada?
22
- 23. Construção de objetos da classe derivada
Construtor da classe base é invocado primeiro, depois o da
classe derivada é executado.
© 2012 Ivan L. M. Ricarte
Se construtor da classe base demanda argumentos, estes podem
ser indicados na especificação do construtor da classe derivada:
23
- 24. O especificador protected
Os especificadores de acesso a membros da classe:
• private: acesso exclusivo a funções membros da própria classe.
© 2012 Ivan L. M. Ricarte
• public: acesso permitido a qualquer função.
• protected: acesso permitido apenas a classes derivadas.
24
- 25. Como usar protected
Se objeto da classe derivada precisa
manipular atributos definidos na
© 2012 Ivan L. M. Ricarte
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!
25
- 26. Uso recomendado de protected
Classe base define um conjunto de funções membro com
visibilidade protected para uso apenas nas classes derivadas:
© 2012 Ivan L. M. Ricarte
26
- 27. © 2012 Ivan L. M. Ricarte
Herança em C++
A HERANÇA DO COMPORTAMENTO
27
- 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:
© 2012 Ivan L. M. Ricarte
Saída: Ivan Método definido na classe base
Padrão: assinatura, especificação e implementação são herdadas.
28
- 29. Extensão
Classe derivada pode incluir novos métodos, não presentes na
interface operacional da classe base:
© 2012 Ivan L. M. Ricarte
Interface pública de Aluno inclui
string nome() [de Pessoa]
e
int obtemRA() [de Aluno]
29
- 30. Redefinição
Classe derivada pode alterar (especializar) a implementação de um
método especificado na classe base, com a mesma assinatura:
© 2012 Ivan L. M. Ricarte
Saída: Academico Ivan
30
- 31. Princípios de herança: sumário
Estrutura:
• Ocultação da informação deve ser preservada.
© 2012 Ivan L. M. Ricarte
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.
31
- 32. © 2012 Ivan L. M. Ricarte
Herança em C++
RECURSOS PARA A PROGRAMAÇÃO GENÉRICA
32
- 33. Motivação
Interesse em tratar objetos de
modo genérico, sem conhecer
© 2012 Ivan L. M. Ricarte
seu tipo específico.
Exemplo: Conjunto de Pessoas.
33
- 34. Princípio da Substituição de Liskov
Um objeto da classe derivada pode
substituir um objeto da classe base sem
© 2012 Ivan L. M. Ricarte
alterar as propriedades desejáveis de um
programa (tarefa executada, correção).
http://ru.wikipedia.org/wiki/
34
- 35. © 2012 Ivan L. M. Ricarte
Declaração das classes
35
- 36. Exemplo de execução
(sem polimorfismo)
© 2012 Ivan L. M. Ricarte
Saída:
Lara
Academico Pedro
Professor Ivan
36
- 37. Tentativa de tratar objetos
genericamente
© 2012 Ivan L. M. Ricarte
Saída:
Lara
Pedro
Ivan
37
- 38. Por que falhou?
Um método que é definido em uma classe sem o especificador
© 2012 Ivan L. M. Ricarte
virtual não pode ser redefinido em classes derivadas
Se redefinição é permitida, método deve ser declarado como virtual
38
- 40. Porque destrutores devem ser
declarados como virtuais
Pessoa p: Aluno a:
nome_ nome_
ra_
© 2012 Ivan L. M. Ricarte
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
40
- 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.
© 2012 Ivan L. M. Ricarte
• Comportamento invariante.
Método virtual:
• Classe derivada pode redefinir o método ou utilizar a
implementação padrão.
Método virtual puro: virtual string nome() = 0;
• Classe derivada deve redefinir o método, não há
implementação padrão.
41
- 42. © 2012 Ivan L. M. Ricarte
Programação orientada a objetos em C++
PRÓXIMOS PASSOS
42
- 43. Próximos passos
Explorando o polimorfismo com funções virtuais:
• Não mais repetir “if-else’s” nos métodos de uma classe.
© 2012 Ivan L. M. Ricarte
• 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.
43
- 44. Leituras adicionais
© 2012 Ivan L. M. Ricarte
Capítulo 12 Item 35 (herança pública modela “é-um”) Capítulo 12
Programação orientada a Item 37 (redefinir função não virtual) Classes derivadas
objetos: herança Item 44 (entender os significados em
herança)
44
- 45. © 2012 Ivan L. M. Ricarte
Ivan Luiz Marques Ricarte
ricarte@unicamp.br
45