Programação orientada a objetos: herança

6,587 views
6,315 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
6,587
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
84
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Programação orientada a objetos: herança

  1. 1. Programação orientada a objetos: herança© 2012 Ivan L. M. Ricarte Prof. Dr. Ivan Luiz Marques Ricarte 1
  2. 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. 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. 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
  5. 5. © 2012 Ivan L. M. Ricarte CONCEITOS PRELIMINARES5
  6. 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. 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. 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. 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. 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. 11. Composição em C++ Classes existentes utilizadas para definir novas classes:© 2012 Ivan L. M. Ricarte 11
  12. 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. 13. © 2012 Ivan L. M. Ricarte O pilar que completa a programação orientada a objetos HERANÇA 13
  14. 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. 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. 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. 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. 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. 19. © 2012 Ivan L. M. Ricarte Herança em C++ DECLARAÇÃO DE CLASSES DERIVADAS 19
  20. 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. 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. 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. 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. 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. 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. 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. 27. © 2012 Ivan L. M. Ricarte Herança em C++ A HERANÇA DO COMPORTAMENTO 27
  28. 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. 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. 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. 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. 32. © 2012 Ivan L. M. Ricarte Herança em C++ RECURSOS PARA A PROGRAMAÇÃO GENÉRICA 32
  33. 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. 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. 35. © 2012 Ivan L. M. Ricarte Declaração das classes35
  36. 36. Exemplo de execução (sem polimorfismo)© 2012 Ivan L. M. Ricarte Saída: Lara Academico Pedro Professor Ivan 36
  37. 37. Tentativa de tratar objetos genericamente© 2012 Ivan L. M. Ricarte Saída: Lara Pedro Ivan 37
  38. 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
  39. 39. Método virtual© 2012 Ivan L. M. Ricarte Saída: Lara Academico Pedro Professor Ivan 39
  40. 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. 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. 42. © 2012 Ivan L. M. Ricarte Programação orientada a objetos em C++ PRÓXIMOS PASSOS 42
  43. 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. 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. 45. © 2012 Ivan L. M. Ricarte Ivan Luiz Marques Ricarte ricarte@unicamp.br 45

×