28
Programação Orientada a Objetos Renato Dourado Maia Universidade Estadual de Montes Claros Engenharia de Sistemas HERANÇA E COMPOSIÇÃO

Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

Embed Size (px)

Citation preview

Page 1: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

Programação Orientada a Objetos

Renato Dourado MaiaUniversidade Estadual de Montes Claros

Engenharia de Sistemas

HERANÇA E COMPOSIÇÃO

Page 2: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 2/28

Unidade IV

• Unidade IV – Herança e Composição:– Herança simples.– Composição.– Combinando composição e herança.– Herança múltipla.– Polimorfismo e funções virtuais.– Classes abstratas.

• Já trabalhamos os tópicos Herança Simples, Composi-ção e Combinando composição e herança.

Page 3: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 3/28

Unidade IV

• O tópico Herança múltipla deverá ser estudado por meio da leitura do livro.

• Hoje veremos o tópico Polimorfismo e funções virtu-ais.

Page 4: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 4/28

Polimorfismo e Funções Virtuais

• Como já foi visto, quando se trabalha com herança pública, pode-se realizar “upcasting” (“cast” para a classe pai) quando necessário.

• A classe derivada é um tipo da classe base e pode substituí-la quando necessário:

void f(Animal &an) { an.come() ;an.dorme();

};void g(Ave &av) { f(av); }

Animal

come()dorme()

Ave

botaOvo()voa()

Mamifero

mama()

Page 5: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 5/28

Polimorfismo e Funções Virtuais

• Um “upcast” também pode ser efetuado em pon-teiros ou referências, sem a necessidade de um cast explícito.

• Obviamente, an1 e an2 poderão ser utilizados ape-nas como Animais e não como Aves.

Ave av; Animal * an1 = & av;

Animal & an2 = av;

an1-> come();an1->dorme();// an1->botaOvo(); // ERRO!!!

Page 6: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 6/28

Polimorfismo e Funções Virtuais

• Problema:– E se um método de Animal, por exemplo, Animal::come,

fosse sobrescrito na classe Ave?class Ave: public Animal {public: void come( ); void voa( ); void botaOvo( );}...Ave av;Animal * an = &av;an-> dorme (); // Animal::dorme()an-> come (); // Animal::come()!

Page 7: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/28

Polimorfismo e Funções Virtuais

• A solução para o problema virá com a utilização de funções virtuais, implementando o Polimorfismo!– O Polimorfismo é o terceiro conceito fundamental da pro-

gramação orientada a objetos (os outros são o Encapsula-mento e a Herança).

– O Polimorfismo provê outra dimensão de separação entre interface e implementação, desacoplando “o quê” de “co-mo”, melhorando a organização do código gerado e o seu entendimento.

Page 8: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 8/28

Polimorfismo e Funções Virtuais

• A solução para o problema virá com a utilização de funções virtuais, implementando o Polimorfismo!– O Polimorfismo permite também a criação de programas

extensíveis que podem ter funcionalidades adicionadas não somente durante o processo de criação do projeto, mas também quando uma nova necessidade for detecta-da.

– O Polimorfismo permitirá trabalhar com toda uma hierar-quia de classes em termos de seu tipo básico!

Page 9: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 9/28

Polimorfismo e Funções Virtuais

• Já foi visto que a herança permite criar classes que podem se comportar como tipos de outras classes.

• Essa possibilidade é muito interessante, pois permite que objetos de diversas classes diferentes, porém derivadas de um mesmo tipo base, possam ser tra-tadas como se elas fossem de um único tipo:– Um código estruturado dessa forma permitirá que se tra-

balhe com todas essas diferentes classes de maneira úni-ca, mas com cada classe podendo possuir uma maneira própria de tratar situações diferentes!

Page 10: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 10/28

Polimorfismo e Funções Virtuais

• Foi essa possibilidade que se tentou explorar no e-xemplo da hierarquia de Animal:– Uma Ave poderia ter sua própria maneira de comer, dife-

rente das dos outros Animais.– Seria interessante que essa maneira diferente de imple-

mentar o método come() fosse preservada, mesmo quan-do o que se tem é um ponteiro para Animal que aponta para um objeto do tipo Ave.

Page 11: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 11/28

Polimorfismo e Funções Virtuais

• Para verificar como efetuar isso, deve-se entender como a linguagem C++ efetua a ligação entre a fun-ção que está sendo chamada e o objeto “chamador” da função.

Page 12: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 12/28

Ligação Entre Objeto e Função

• A conexão entre uma chamada à função e o corpo da função é chamada de ligação: binding. – Quando a ligação é efetuada antes da execução do pro-

grama (efetuada pelo compilador e pelo linker) ela é deno-minada de ligação estática (early binding):

✔ Essa é a maneira tradicional de efetuar a ligação.

Page 13: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 13/28

Ligação Entre Objeto e Função

• O problema da chamada ao método come() de Ave é causado pela ligação estática: o compilador não con-segue determinar a função correta a ser chamada, quando a única coisa que ele conhece é o tipo do ponteiro (Animal*) que está sendo utilizado.

• A solução para o problema é utilizar ligação dinâmi-ca (late binding), que significa que a ligação será efe-tuada em tempo de execução, baseada no tipo do objeto que está sendo apontado, e não no tipo do ponteiro.

Page 14: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 14/28

Funções Virtuais

• Para permitir que a ligação dinâmica (late binding) o-corra para determinada função, é necessário em C++ que a função seja declarada como virtual na classe base. No restante da hierarquia, ela será virtual.

• Além disso, é necessário que os objetos estejam sen-do manipulados por meio de ponteiros ou referên-cias para a classe base. Se não for esse o caso, o compilador executa a ligação entre o objeto e a fun-ção a ser chamada em tempo de compilação!

Page 15: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 15/28

Funções Virtuais

• Somente a declaração da função necessita da pala-vra chave virtual, não a definição...

• Pode-se usar a palavra chave virtual nas declarações da função nas classes derivadas, mas isso é redun-dante!

Page 16: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 16/28

Polimorfismo e Funções Virtuais

• Solução do problema básico:

class Animal {public: virtual void come( ); virtual void dorme( );};class Ave: public Animal {public: void come( ); void voa( ); void botaOvo( );}

void g(Animal &an) { an.come();}

int main() { Ave av; Animal an1; g(av); // OK: upcasting! g(an1); // OK! Animal * ptan = &av; // upcasting! ptan-> dorme (); // Animal::dorme() ptan-> come (); // Ave::come() return 0;}

Page 17: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 17/28

Polimorfismo – Síntese

• O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo de uma hierarquia.

• Para que haja polimorfismo, a ligação entre o objeto e a função deve ser feita em tempo de execução (li-gação dinâmica).

Page 18: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 18/28

Polimorfismo – Síntese

• A implementação do polimorfismo em C++ pressu-põe a utilização de funções virtuais.

• Quando uma classe base tem funções que devem ter comportamentos diferentes para as suas derivadas, elas devem ser declaradas como virtuais na base e os seus códigos devem ser redefinidos nas deriva-das.

Page 19: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 19/28

Polimorfismo – Outro Exemplo

• Considere a definição de um tipo como Shape, a ser utilizado em um sistema gráfico. O sistema deve su-portar círculos, triângulos e quadrados:

class Point { /* ... */};class Color{ /* ... */};enum Kind { circle, triangle, square };class Shape {

Kind k; Point center;Color col;

public:void draw( );void rotate(float ang);// ...

};

void Shape :: draw( ){ switch (k) { case circle:

// desenha o circulo break; case triangle:

// desenha o triangulo break; case square:

// desenha o quadrado break; } // end switch}

Page 20: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28

Polimorfismo – Outro Exemplo

• Problemas:– Funções como draw() precisam conhecer todos os tipos

de Shape que possam existir...– A função deve ser modificada toda vez que um novo Sha-

pe for adicionado ao sistema:✔ O código de draw é aumentado a cada inclusão de um Shape di-

ferente.

– Na realidade, todas as funções que trabalham com shapes terão que ser examinadas e modificadas!

Page 21: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 21/28

Polimorfismo – Outro Exemplo

• Problemas:– Um novo Shape poderá ser adicionado apenas no caso de

se ter acesso ao código fonte de todas as operações...– A parte de dados de Shape tem que ser escolhida de ma-

neira que acomode todas as possíveis representações de uma forma, seja ela qual for...

Page 22: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 22/28

Polimorfismo – Outro Exemplo

• Pensando na solução:– Uma saída está em se agrupar o que é comum a todas as

Shapes (elas possuem uma forma, uma cor, podem ser de-senhadas, giradas, etc) em uma classe, e as propriedades e métodos específicos de triângulos, círculos e demais shapes em classes derivadas:

✔ Isso já foi visto: herança!

Page 23: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 23/28

Polimorfismo – Outro Exemplo

• Pensando na solução:

Circ le

draw()

Square

draw()

Triangle

draw()()

Shape

draw()

Page 24: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 24/28

Polimorfismo – Outro Exemplo

• Problema da solução:– Seja o código a seguir:

class Shape {// ...public: void draw( ) { cout << “Shape::draw”; }};class Triangle : public Shape {// ...public: void draw( ) { cout << “Triangle::draw”;}};

void teste(Shape & a) { a.draw();}int main() { Triangle t; teste(t); // Vai chamar draw de Shape! E não de Triangle! }

Page 25: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 25/28

Polimorfismo – Outro Exemplo

E agora, quem poderá nos ajudar?

Page 26: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 26/28

O Chapolim Colorado?

O POLIMORFISMO É A SOLUÇÃO!

Page 27: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 27/28

Importante

• Esta apresentação é uma adaptação do material ori-ginalmente desenvolvido pelo professor Renato Car-doso Mesquita, do Departamento de Engenharia Elé-trica da Universidade Federal de Minas Gerais.

http://www.cpdee.ufmg.br/~renato

Page 28: Programação Orientada a Objetos - renatomaia.net · Polimorfismo – Síntese • O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo

24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 28/28

That's All Folks!