Programação orientada a objetos: herança
© 2012 Ivan L. M. Ricarte




                                   Prof. Dr. Ivan Luiz Marques Ricarte




                                                                         1
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
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
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
© 2012 Ivan L. M. Ricarte




    CONCEITOS PRELIMINARES



5
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
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
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
Ocultação em C++


                            Especificadores de escopo:

                            • private para atributos.
© 2012 Ivan L. M. Ricarte




                            • public para métodos da
                              interface pública.




                                                         9
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
Composição em C++


                            Classes existentes utilizadas para definir novas classes:
© 2012 Ivan L. M. Ricarte




                                                                                        11
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
© 2012 Ivan L. M. Ricarte




                            O pilar que completa a programação orientada a objetos
                            HERANÇA



                                                                                     13
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
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
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
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
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
© 2012 Ivan L. M. Ricarte




                            Herança em C++
                            DECLARAÇÃO DE CLASSES DERIVADAS



                                                              19
Como declarar uma classe derivada
                            em C++

                                 class Derivada : public Base {
© 2012 Ivan L. M. Ricarte




                                 ...

                                 };

                                       Base b;              Derivada d;

                                             Base                    Base

                                                                   Derivada



                                                                              20
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
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
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
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
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
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
© 2012 Ivan L. M. Ricarte




                            Herança em C++
                            A HERANÇA DO COMPORTAMENTO



                                                         27
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
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
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
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
© 2012 Ivan L. M. Ricarte




                            Herança em C++
                            RECURSOS PARA A PROGRAMAÇÃO GENÉRICA



                                                                   32
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
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
© 2012 Ivan L. M. Ricarte



                                 Declaração das classes




35
Exemplo de execução
                            (sem polimorfismo)
© 2012 Ivan L. M. Ricarte




                                                  Saída:
                                                           Lara
                                                           Academico Pedro
                                                           Professor Ivan

                                                                             36
Tentativa de tratar objetos
                            genericamente
© 2012 Ivan L. M. Ricarte




                                                  Saída:
                                                           Lara
                                                           Pedro
                                                           Ivan

                                                                   37
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
Método virtual
© 2012 Ivan L. M. Ricarte




                                             Saída:
                                                      Lara
                                                      Academico Pedro
                                                      Professor Ivan
                                                                        39
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
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
© 2012 Ivan L. M. Ricarte




                            Programação orientada a objetos em C++
                            PRÓXIMOS PASSOS



                                                                     42
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
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
© 2012 Ivan L. M. Ricarte




                            Ivan Luiz Marques Ricarte
                               ricarte@unicamp.br




                                                        45

Programação orientada a objetos: herança

  • 1.
    Programação orientada aobjetos: herança © 2012 Ivan L. M. Ricarte Prof. Dr. Ivan Luiz Marques Ricarte 1
  • 2.
    Considerações iniciais sobreo 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 sobreo 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
  • 5.
    © 2012 IvanL. M. Ricarte CONCEITOS PRELIMINARES 5
  • 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 daprogramação orientada a objetos © 2012 Ivan L. M. Ricarte http://gestaoeevolucao.blogspot.com.br Ocultação Composição Encapsulação 12
  • 13.
    © 2012 IvanL. 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 IvanL. M. Ricarte Herança em C++ DECLARAÇÃO DE CLASSES DERIVADAS 19
  • 20.
    Como declarar umaclasse derivada em C++ class Derivada : public Base { © 2012 Ivan L. M. Ricarte ... }; Base b; Derivada d; Base Base Derivada 20
  • 21.
    Estrutura da classederivada 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 acessona 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 objetosda 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 deprotected 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 IvanL. 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 IvanL. 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çãode 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 IvanL. 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 tratarobjetos 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
  • 39.
    Método virtual © 2012Ivan L. M. Ricarte Saída: Lara Academico Pedro Professor Ivan 39
  • 40.
    Porque destrutores devemser 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 osdiferentes 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 IvanL. 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 © 2012Ivan 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 IvanL. M. Ricarte Ivan Luiz Marques Ricarte ricarte@unicamp.br 45