programação orientada a objetos - renatomaia.net · 24/08/15 programação orientada a objetos...

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

Upload: vuongtu

Post on 30-Nov-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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 · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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 o tópico Herança Simples.– Hoje trabalharemos os tópicos Composição e Combinando

Composição e Herança.

Page 3: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Composição

• Na composição utilizam-se objetos das classes exis-tentes dentro da nova classe: – A nova classe é composta de objetos de classes existentes.

• Exemplos de composição: – Classes roda, motor, lataria e a classe carro.– Classes motor, controle do motor, cabeça de leitura, cabe-

ça de gravação e a classe videocassete.

Page 4: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Composição

Roda Motor

Carro

4 1

Lataria

1114 CabecaDeGravacao

Motor CabecaDeLeitura

Videocassete

ControleDeMotor

Page 5: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Composição

Como se identifica a composição?

Page 6: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Composição

• Identifica-se a possibilidade de composição por meio dos verbos conter e possuir:– Um carro contém 4 rodas, um motor, uma lataria...

Roda Motor

Carro

4 1

Lataria

1114

Page 7: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Composição – Sintaxe

class Roda { };class Motor { };class Lataria { };class Carro { vector <Roda> rodas; Motor mot; Lataria lata;public: ...};

Page 8: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Composição

• Para inicializar os objetos utilizados para compor o novo objeto pode ser utilizada a seção de inicializa-ção do construtor:

class Roda { double raio;public: Roda(double r) : raio(r) {}};class Motor { double pot;public: Motor(double p): pot (p) { }};class Lataria { Cor cor; public: Lataria(Cor c): cor(c) { } };

class Carro { vector<Roda> rodas; Motor mot; Lataria lata;public: Carro (double r, double p, Cor c) : rodas(4, Roda(r)) , mot(p), lata(c) {}};int main() { Carro c1(10., 20., Cor(2)); return 0;

}

Page 9: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Combinando Composição e Herança

• A composição e a herança podem ser utilizadas si-multaneamente para a criação de nova classes:

B

i : int

B (ii : int)f ()~B ()

A

i : int

A (ii : int)f ()~A ()

C

C (ii : int)f ()~C ()

11

class A { int i;public: A(int ii) : i(ii) {} ~A() {} void f() const {}};class B { int i;public: B(int ii) : i(ii) {} ~B() {} void f() const {}};

class C : public B { A a;public: C(int ii) : B(ii), a(ii) {} ~C() {} // chama ~B e ~A void f() const { a.f(); B::f(); }};int main() { C c(47);}

Page 10: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Ordem de Chamada de Destrutores

• Quando os objetos de classes derivadas deixam seu escopo, ocorre a chamada de destrutores existentes ao longo da hierarquia.

• A ordem de chamada dos destrutores é inversa à or-dem de chamada dos construtores:– Primeiro é chamado o destrutor da classe derivada, depois

os atributos da classe derivada são destruídos, o(s) des-trutor(es) da(s) classe(s) base é(são) chamado(s) e os atri-butos da(s) classe(s) base são destruídos...

Page 11: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança e Operadores

• Todos os operadores, com exceção do operador de atribuição, são herdados pelas classes derivadas, in-clusive os operadores de conversão de tipo.

Page 12: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança ou Composição

• Tanto a composição como a herança permitem a reu-tilização de código contido em outras classes:– Ambas colocam subobjetos dentro da nova classe.– Ambas utilizam a seção de inicialização dos construtores

para construir esses subobjetos.

• Quais as diferenças entre elas? Quando escolher u-ma ou outra?

Page 13: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança ou Composição

• Herança: – As características da classe base estão na interface da

classe filha, ou seja, a nova classe é um tipo da classe ba-se, podendo substituí-la.

✔ Subtipagem.

• Composição:– A nova classe contém as características das classes utiliza-

das na composição, mas essas características geralmente não aparecem na interface, ou seja, a nova classe não é um tipo da classe antiga, mas contém objetos da classe.

Page 14: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança Privada

• Na herança privada, o que era público na classe base passa a ser privado na classe derivada: – A classe derivada não é um tipo da classe base.– A classe derivada é implementada em termos da classe

base!

• Podem-se expor alguns nomes na interface pública utilizando-se a palavra chave using.

Page 15: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança Privada – Sintaxeclass Pet {public: char eat() const { return 'a'; } int speak() const { return 2; } float sleep() const { return 3.0; } float sleep(int) const { return 4.0; }};class Goldfish : Pet { // Private inheritance public: using Pet::eat; // Name publicizes member using Pet::sleep; // Both overloaded members exposed };int main() { Goldfish bob; bob.eat(); bob.sleep(); bob.sleep(1);//! bob.speak();// Error: private

Page 16: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Atributos Protegidos

• Até o momento, os únicos especificadores de acesso aos membros das classes trabalhados foram public e private.

• Porém, com a utilização de herança, a palavra chave protected passa a fazer sentido...

• Tudo o que é privado é acessível apenas para as fun-ções da classe e para ninguém mais...

Page 17: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Atributos Protegidos

• E se o objetivo for ter algo privado para os usuários da classe, mas acessível para os membros da própria classe e de suas classes derivadas?– protected!

Page 18: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Atributos Protegidos

• Estratégia geral: – Faça os atributos sempre private:

✔ Você quer preservar o direito de modificar a implementação das estruturas internas da classe, mas sem afetar outras partes do có-digo (mesmo o código de classes derivadas).

– Você pode fornecer acesso controlado a esses dados para as classes derivadas por meio de funções membro protec-ted...

Page 19: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Atributos Protegidos

include <fstream>using namespace std;class Base { int i;protected: int read() const { return i; } void set(int ii) { i = ii; }public: Base(int ii = 0) : i(ii) {} int value(int m) const { return m*i; }};

class Derived : public Base { int j;public: Derived(int jj = 0) : j(jj) {} void change(int x) { set(x); }};int main() { Derived d; d.change(10);}

Page 20: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança Protegida

• Como já foi visto, o tipo mais comum de herança é a pública, em que o que era público na classe base continua público na derivada e o que era protegido na classe base continua protegido na derivada: – A classe derivada é um tipo da classe base.

Page 21: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança Protegida

• Na herança privada, todos os membros públicos ou protegidos da classe base se tornam privados na classe derivada.

• A classe derivada não é um tipo da classe base: – A classe derivada é implementada em termos da classe

base.

Page 22: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Herança Protegida

• Uma herança protegida significa implementada em termos da classe base para os usuários da classe e é um tipo de para as classes derivadas dessa nova clas-se.

• Cabe destacar que isso é algo que não se utiliza mui-to frequentemente...

Page 23: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Desenvolvimento Incremental

• Uma das grandes vantagens da utilização de herança e composição é o fato delas suportarem o desenvol-vimento incremental: – Código novo é introduzido sem causar erros em código e-

xistente.– Se erros aparecerem, eles deverão estar isolados no códi-

go novo! – Lindo! Adeus bugs do ctrl + c, ctrl + v!

Page 24: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Desenvolvimento Incremental

• Por meio da herança ou da composição com uma classe existente, já bastante testada, podem-se adi-cionar atributos ou métodos (ou mesmo redefinir métodos na herança), sem modificar o código exis-tente, que alguém ainda pode estar utilizando.

• O código antigo permanece intocado e sem erros!– Se algum erro aparecer, ele vai aparecer no código novo!

Page 25: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Desenvolvimento Incremental

• Código novo e antigo são muito bem separados! • Não é necessário ter acesso ao código das classes

antigas para adicionar funcionalidades:– Basta ter acesso aos arquivos de cabeçalho e ao código

objeto, na forma de bibliotecas.

Page 26: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

Desenvolvimento Incremental

• Apenas leve em conta que, depois de verificado o funcionamento do código novo, geralmente é neces-sário fazer uma análise da hierarquia de classes ge-rada para verificar se a herança e a composição, quando utilizadas, fazem sentido, sob o ponto de vis-ta do projeto das classes.

• Se não fizerem, devem ser refeitos o projeto e a im-plementação!

Page 27: Programação Orientada a Objetos - renatomaia.net · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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 · 24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28 Herança Protegida • Como já foi visto, o tipo mais

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

That's All Folks!