programação orientada a objetos · 24/08/15 programação orientada a objetos – renato dourado...

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

Upload: others

Post on 27-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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 · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

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.

• Hoje trabalharemos o tópico Classes Abstratas.

Page 3: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

Circ le

draw()

Square

draw()

Triangle

draw()()

Shape

draw()

Brass

play( )what( )

Instrument

play( )what( )adjust( )

Wind

play( )what( )adjust( )

Percussion

play( )what( )adjust( )

Stringed

play( )what( )adjust( )

Woodwind

play( )what( )

Page 4: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• As classes Shape e Instrument apresentadas no slide anterior são classes criadas apenas para servirem de base para uma hierarquia e para definir a interface que todas as classes derivadas na hierarquia devem seguir.

• Não tem sentido definir algumas de suas funções: – O que seria draw() para uma Shape genérica? – O que seria play() para um instrumento genérico?

Page 5: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Não faz sentido também declarar objetos dessas classes: devem ser utilizados ponteiros/referências.

• Os objetos concretos que vão ser instanciados são os “elementos de verdade”: – Triangle, Percussion, etc …

• Deve-se, então, avisar ao compilador que as classes base das hierarquias (Shape e Instrument) são abs-tratas!

Page 6: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Cria-se uma classe abstrata para gerar uma interface comum a várias classes: – O objetivo é manipular objetos dessas várias classes por

intermédio de uma interface comum.

• Para criar uma classe abstrata em C++ basta declarar uma função membro como virtual pura:– virtual void draw() = 0;

Page 7: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Qualquer tentativa de declaração de um objeto de uma classe abstrata gera um erro de compilação. Entretanto, é permitido declarar referências e pon-teiros para classes abstratas, desde que apontem para objetos de classes derivadas na hierarquia e que, nelas, as funções virtuais puras tenham todas sido definidas.

• Repetindo: cria-se uma classe abstrata quando se de-seja manipular um conjunto de classes por intermé-dio de uma interface comum.

Page 8: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Quando se cria uma nova classe a partir de uma clas-se base abstrata, todas as funções virtuais puras de-vem ser implementadas ou a classe derivada tam-bém será abstrata.

• Lembrando: como não podem ser declarados objetos de uma classe abstrata, devem ser utilizados pontei-ros e referências!

Page 9: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

class Instrument {public: // Pure virtual functions: virtual void play(note) const = 0; virtual char* what() const = 0; virtual void adjust(int) = 0;};// Rest of the hierarchy is the same...

Brass

play( )what( )

Instrument

play( )what( )adjust( )

Wind

play( )what( )adjust( )

Percussion

play( )what( )adjust( )

Stringed

play( )what( )adjust( )

Woodwind

play( )what( )

Page 10: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Qual é o propósito de se ter uma função virtual pu-ra?– Criar uma classe abstrata.– Fazer com que as classes derivadas herdem somente a in-

terface da função.

• Qual é o propósito de se ter funções virtuais (impu-ras)?– Fazer com que as classes derivadas herdem a interface e

uma implementação padrão para a função.

Page 11: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Qual é o propósito de se ter funções virtuais na clas-se base?– Fazer com que as classes derivadas herdem a interface da

função, além de uma implementação obrigatória.– Nunca redefina uma função não virtual herdada, pois isso

pode causar sérios problemas quando se está trabalhando com objetos por meio de ponteiros ou referências: o poli-morfismo não funcionaria!

HERANÇA DE INTERFACE ≠ HERANÇA DE IMPLEMENTAÇÃO

Page 12: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratasclass Point { /* ... */};class Color{ /* ... */};class Shape { // Classe Abstrata

Point center;Color col;

public:Point where( ) const { return center;}void move( Point to) { center = to; /* .... */ draw(); }virtual void draw( ) = 0 // Virtual puravirtual void rotate(float ang)= 0; // Também ...virtual bool is_closed ( ) = 0; // Também

};class Circle : public Shape {

real radius;public:

void draw() { /* .... */}void rotate (float) { } // Vazia, precisa definir a função purabool is_closed( ) { return true;}Circle (Point p, int r);

};

Page 13: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Uma classe que não redefine uma função virtual pura continua abstrata, o que permite que a imple-mentação seja construída em etapas:

class Poligon: public Shape {public:

bool is_closed( ) { return true; }// draw e rotate não foram redefinidas: Polígono é abstrata

};

Poligon b; // Erro: declaracao de um objeto de classe abstrata

class Irregular_polygon : public Poligon {vector <Point> lp; public:

void draw();void rotate(float); // Não se tem mais funções virtuais puras// ...

};

Irregular_polygon poly(alguns_pontos); // OK, se existir o construtor

Page 14: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Uma utilização importante de classes abstratas é no fornecimento de uma interface sem expor qualquer detalhe da implementação. – Por exemplo, um sistema operacional poderia esconder os

detalhes dos seus dispositivos físicos em uma classe abs-trata:

class Device {public:

virtual int open(char*, int, int) = 0;virtual int close(int) = 0;virtual int read(int, char*, int) = 0;virtual int write(int, const char*, int) = 0;virtual int ioctl(int, int ...) = 0;virtual ~Device(); // Destrutor virtual

};

Page 15: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Poderiam ser especificados drivers para dispositivos físicos como classes derivadas de Device e manipu-lar uma grande variedade de drivers por intermédio da interface comum a todos eles:

class Disk : public Device {public:

int open(char*, int, int);int close(int);int read(int, char*, int);int write(int, const char*, int);int ioctl(int, int ...);Disk();~Disk();

};

Page 16: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Classes Abstratas

• Poderia também ser definida uma classe abstrata pa-ra os processos:

class Proc {public:

virtual int sleep (Sleepq*, int)=0;virtual void wakeup()=0;virtual int save_runstate()=0;virtual void resume_runstate()=0;virtual int send_msg(int)=0;Proc(int);Proc (Proc &);virtual ~Proc();

};

Pela introdução de classes abstratas, ficam disponíveis os mecanismos básicos para escrever um programa completo de forma modular, utilizando a interface

das classes abstratas como os blocos de construção.LINDO!

Page 17: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Object Slicing

• Existe uma grande diferença entre passar uma refe-rência para um objeto (ou o endereço de um objeto) e passar o objeto por valor para uma função!

• Se a função esperar receber um objeto do tipo da classe base, por cópia, e for passado um objeto da classe derivada, somente a parte base do objeto se-rá copiada:– O objeto é “cortado”!

void h(Animal a) ;Ave av;h (av);// o objeto av vai ser “cortado”: somente a sua parte // Animal vai ser passada para h...

Page 18: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

Padrões de Projeto

• Template Method.• Strategy.• Observer.

Ficam para uma próxima oportunidade!

Page 19: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

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 20: Programação Orientada a Objetos · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/20 Classes Abstratas • Qualquer tentativa de declaração de um objeto

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

That's All Folks!