programação orientada a objetos: herança

45
© 2012 Ivan L. M. Ricarte 1 Programação orientada a objetos: herança Prof. Dr. Ivan Luiz Marques Ricarte

Upload: ivan-ricarte

Post on 24-May-2015

5.015 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

1

Programação orientada a objetos: herança

Prof. Dr. Ivan Luiz Marques Ricarte

Page 2: Programação orientada a objetos: herança

© 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/

Page 3: Programação orientada a objetos: herança

© 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.

Page 4: Programação orientada a objetos: herança

© 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++.

Page 5: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

5

CONCEITOS PRELIMINARES

Page 6: Programação orientada a objetos: herança

© 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.

Page 7: Programação orientada a objetos: herança

© 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);

Page 8: Programação orientada a objetos: herança

© 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.

Page 9: Programação orientada a objetos: herança

© 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.

Page 10: Programação orientada a objetos: herança

© 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/

Page 11: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

11

Composição em C++

Classes existentes utilizadas para definir novas classes:

Page 12: Programação orientada a objetos: herança

© 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

Page 13: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

13

HERANÇA

O pilar que completa a programação orientada a objetos

Page 14: Programação orientada a objetos: herança

© 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.

Page 15: Programação orientada a objetos: herança

© 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

Page 16: Programação orientada a objetos: herança

© 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

Page 17: Programação orientada a objetos: herança

© 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).

Page 18: Programação orientada a objetos: herança

© 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

Page 19: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

19

DECLARAÇÃO DE CLASSES DERIVADAS

Herança em C++

Page 20: Programação orientada a objetos: herança

© 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

Page 21: Programação orientada a objetos: herança

© 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_

Page 22: Programação orientada a objetos: herança

© 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!

Page 23: Programação orientada a objetos: herança

© 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:

Page 24: Programação orientada a objetos: herança

© 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.

Page 25: Programação orientada a objetos: herança

© 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!

Page 26: Programação orientada a objetos: herança

© 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:

Page 27: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

27

A HERANÇA DO COMPORTAMENTO

Herança em C++

Page 28: Programação orientada a objetos: herança

© 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

Page 29: Programação orientada a objetos: herança

© 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]

Page 30: Programação orientada a objetos: herança

© 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

Page 31: Programação orientada a objetos: herança

© 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.

Page 32: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

32

RECURSOS PARA A PROGRAMAÇÃO GENÉRICA

Herança em C++

Page 33: Programação orientada a objetos: herança

© 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.

Page 34: Programação orientada a objetos: herança

© 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/

Page 35: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

35

Declaração das classes

Page 36: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

36

Exemplo de execução (sem polimorfismo)

Saída: Lara Academico Pedro Professor Ivan

Page 37: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

37

Tentativa de tratar objetos genericamente

Saída: Lara Pedro Ivan

Page 38: Programação orientada a objetos: herança

© 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

Page 39: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

39

Método virtual

Saída: Lara Academico Pedro Professor Ivan

Page 40: Programação orientada a objetos: herança

© 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

Page 41: Programação orientada a objetos: herança

© 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;

Page 42: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

42

PRÓXIMOS PASSOS

Programação orientada a objetos em C++

Page 43: Programação orientada a objetos: herança

© 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.

Page 44: Programação orientada a objetos: herança

© 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

Page 45: Programação orientada a objetos: herança

© 2

01

2 Iv

an L

. M. R

icar

te

45

Ivan Luiz Marques Ricarte [email protected]