Programação Orientada a Objetos
Renato Dourado MaiaUniversidade Estadual de Montes Claros
Engenharia de Sistemas
HERANÇA E COMPOSIÇÃO
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.
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.
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
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 5/28
Composição
Como se identifica a composição?
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
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: ...};
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;
}
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);}
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...
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.
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?
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.
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.
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
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...
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!
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...
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);}
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.
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.
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...
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!
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!
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.
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!
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
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 28/28
That's All Folks!