A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Aula 8 Polimorfismo.

Apresentações semelhantes


Apresentação em tema: "Aula 8 Polimorfismo."— Transcrição da apresentação:

1 Aula 8 Polimorfismo

2 protected Acesso mais limitado que public
Acesso menos limitado que private Membros com categoria de acesso protected funcionam como private para o público em geral, e como public para as classes derivadas 2003/2004 Programação Orientada para Objectos

3 protected class A { public: A(int const a) : a(a) {} protected: int a;
}; class B : public A { void mostra() const { cout << a << endl; } 2003/2004 Programação Orientada para Objectos

4 Empregado… class Empregado { public: Empregado(string const& nome,
Sexo const sexo); string const& nome() const; Sexo sexo() const; void mostra() const; private: string nome_; Sexo sexo_; }; Empregado::Empregado(string const& nome, Sexo const sexo) : nome_(nome), sexo_(sexo) {} string const& Empregado::nome() const { return nome_; } Sexo Empregado::sexo() const return sexo_; void Empregado::mostra() const cout << “Nome: “ << nome() << endl << “Sexo: “ << sexo() << endl; 2003/2004 Programação Orientada para Objectos

5 … e Chefe. Chefe::mostra() oculta Empregado::mostra().
Classe derivada. class Chefe : public Empregado { public: Chefe(string const& nome, Sexo const sexo, int const nível); int nível() const; void mostra() const; private: int nível_; }; Chefe::Chefe(string const& nome, Sexo const sexo, int const nível) : Empregado(nome, sexo), nível_(nível) {} int Chefe::nível() const { return nível_; } void Chefe::mostra() const Empregado::mostra(); cout << “Nível: “ << nível() << endl; é um Classe base. 2003/2004 Programação Orientada para Objectos

6 Relação de generalização
Empregado Relação de generalização. Atributos e operações omitidos. Chefe 2003/2004 Programação Orientada para Objectos

7 Herança pública Classe derivada herda membros da classe base
Só é necessário definir o que é novo ou especializado Membros herdados mantêm categoria de acesso Relação é um Corte (slicing) Ponteiros e referências do tipo da classe base podem-se referir a objectos de classes derivadas! Ocultação Classe derivada declara operação com mesmo nome de uma existente na classe base. 2003/2004 Programação Orientada para Objectos

8 Outras relações entre classes
Funciona como um, mas… Herança privada Membros herdados são privados Tem um Variável membro Composição Ser humano tem braços Agregação Ser humano tem relógio de pulso 2003/2004 Programação Orientada para Objectos

9 Objectivo: tratar empregados e chefes uniformemente
Problema: aparece tudo como empregados! list<Empregado*> pessoal; pessoal.push_back(new Empregado(“João Maria”,masculino)); pessoal.push_back(new Chefe(“Ana Maria”, feminino, 4)); for(list<Empregado*>::iterador i = pessoal.begin(); i != pessoal.end(); ++i) (*i)->mostra(); delete *i; Nome: João Maria Sexo: masculino Nome: Ana Maria Sexo: feminino 2003/2004 Programação Orientada para Objectos

10 pessoal: list<Empregado*>
Objectos pessoal: list<Empregado*> : Empregado* : Empregado* ! ! Ligação. : Empregado nome_ = “João Maria” sexo_ = masculino : Chefe nome_ = “Ana Maria” sexo_ = feminino nível_ = 4 2003/2004 Programação Orientada para Objectos

11 Operações polimórficas
Classe polimórfica. class Empregado { public: Empregado(string const& nome, Sexo const sexo); string const& nome() const; Sexo sexo() const; virtual void mostra() const; private: string nome_; Sexo sexo_; }; Operação polimórfica ou virtual. 2003/2004 Programação Orientada para Objectos

12 Operações polimórficas
Classe polimórfica. class Chefe : public Empregado { public: Chefe(string const& nome, Sexo const sexo, int const nível); int nível() const; virtual void mostra() const; private: int nível_; }; A assinatura tem de ser exactamente igual! Sobreposição: fornecimento de um método especializado para a classe derivada que implementa a operação da classe base. 2003/2004 Programação Orientada para Objectos

13 Polimorfismo Selecçção do método depende do tipo do objecto e não do tipo do ponteiro. list<Empregado*> pessoal; pessoal.push_back(new Empregado(“João Maria”,masculino)); pessoal.push_back(new Chefe(“Ana Maria”, feminino, 4)); for(list<Empregado*>::iterador i = pessoal.begin(); i != pessoal.end(); ++i) (*i)->mostra(); delete *i; Nome: João Maria Sexo: masculino Nome: Ana Maria Sexo: feminino Nível: 4 2003/2004 Programação Orientada para Objectos

14 Distinção entre operação e método
Algo que se pode invocar para uma instância de uma classe para atingir determinado objectivo Método Implementação da operação para uma classe concreta Invocação de uma operação leva à execução de um método Quando há polimorfismo, a invocação de uma operação pode levar à execução de diferentes métodos 2003/2004 Programação Orientada para Objectos

15 Ligação estática vs. dinâmica
Ligação estática (operações não polimórficas) É o compilador que decide qual o método que é executado quando se invoca a operação Ligação dinâmica (operações polimórficas) Só durante a execução do programa é que se sabe que método é executado, pois depende da classe do objecto e não do ponteiro ou referência 2003/2004 Programação Orientada para Objectos

16 Polimorfismo Classe derivada não é obrigada a sobrepor versões especializadas dos métodos da classe base: Programador que desenhou classe base entende que classes derivadas não devem fornecer métodos especializados como implementação dessa operação Invocação de operações polimórficas usa ligação dinâmica É menos eficiente que invocação de operações não polimórficas 2003/2004 Programação Orientada para Objectos

17 Chefe com subordinados
class Chefe : public Empregado { public: Chefe(string const& nome, Sexo const sexo, int const nível); int nível() const; virtual void mostra() const; void subordina(Empregado* const subordinado); private: int nível_; list<Empregado*> subordinados; }; void Chefe::subordina(Empregado* const subordinado) { subordinados.push_back(subordinado); } 2003/2004 Programação Orientada para Objectos

18 Chefe com subordinados
list<Empregado*> pessoal; Empregado* pe = new Empregado("João Maria", masculino); pessoal.push_back(pe); Chefe* pc = new Chefe("Ana Maria", feminino, 4); pc->subordina(pe); pessoal.push_back(pc); for(list<Empregado*>::iterator i = pessoal.begin(); i != pessoal.end(); ++i)     (*i)->mostra(); for(list<Empregado*>::iterator i = pessoal.begin(); i != pessoal.end(); ++i)     delete *i; É invocado o destrutor de Empregado. 2003/2004 Programação Orientada para Objectos

19 Destrutor virtual class Empregado { public: Empregado(string const& nome, Sexo const sexo); virtual ~Empregado() {} string const& nome() const; Sexo sexo() const; virtual void mostra() const; private: string nome_; Sexo sexo_; }; Regra: se uma classe é base de uma hierarquia de classes polimórficas, tem de definir um destrutor virtual! Recomendação: Devem-se explicitar sempre as operações polimórficas (virtual). 2003/2004 Programação Orientada para Objectos

20 Veículos Conceitos relacionados Um Automóvel é um Veículo
Um Motociclo é um Veículo Uma Honda Dominator NX 650 é um Motociclo Um Audi TT é um Automóvel 2003/2004 Programação Orientada para Objectos

21 Veículos: implementação
class Veículo {     … }; class Automóvel : public Veículo { class Motociclo: public Veículo { class HondaNX650 : public Motociclo { class AudiTT : public Automóvel { 2003/2004 Programação Orientada para Objectos

22 Veículos: representação
Conceitos abstractos. Veículo Automóvel Motociclo Conceitos concretos. AudiTT HondaNX650 2003/2004 Programação Orientada para Objectos

23 Editor de figuras bidimensionais
class Posição { public: Posição(double const x, double const y); double x() const; double y() const; private: double x_; double y_; }; class Dimensão { Dimensão(double const largura, double const altura); double largura() const; double altura() const; private: double largura_; double altura_; }; class Caixa { public: Caixa(Posição const& posição, Dimensão const& dimensão); Posição const& posição() const; Dimensão const& dimensão() const; Posição posição_; Dimensão dimensão_; 2003/2004 Programação Orientada para Objectos

24 Figuras e formas Figura Formas list<Forma*> figura; Quadrado
Círculo Conceito abstracto. Conceitos concretos. 2003/2004 Programação Orientada para Objectos

25 Classe Forma class Forma { public: Forma(Posição const& posição);
double área() const; double perímetro() const; Posição const& posição() const; Caixa const caixaEnvolvente() const; void movePara(Posicão const& nova_posição); private: Posição posição_; }; 2003/2004 Programação Orientada para Objectos

26 Forma: métodos Forma::Forma(Posição const& posição)
    : posição_(posição) {} double Forma::área() const { return ???; } double Forma::perímetro() const Posição const& Forma::posição() const     return posição_; Caixa const Forma:: caixaEnvolvente() const { return ???; } void Forma:: movePara(Posição const& nova_posição)     posição_ = nova_posição; 2003/2004 Programação Orientada para Objectos

27 Classe Forma Base de uma hierarquia de classes polimórficas.
class Forma { public: Forma(Posição const& posição); virtual ~Forma() {} virtual double área() const; virtual double perímetro() const; Posição const& posição() const; virtual Caixa const caixaEnvolvente() const; virtual void movePara(Posicão const& nova_posição); private: Posição posição_; }; Base de uma hierarquia de classes polimórficas. 2003/2004 Programação Orientada para Objectos

28 Classe Círculo Não é polimórfico: não pode ser especializado.
class Círculo : public Forma { public: Círculo(Posição const& posição, double const raio); virtual double área() const; virtual double perímetro() const; virtual Caixa const caixaEnvolvente() const; double raio() const; private: double raio_; }; Não é polimórfico: não pode ser especializado. 2003/2004 Programação Orientada para Objectos

29 Círculo: métodos Círculo:: Circulo(Posição const& posição,
double const raio) : Forma(posição), raio_(raio)  {} double Círculo::área() const {     return 2.0 * pi * raio(); } double Círculo::perímetro() const     return pi * raio() * raio(); Caixa const Círculo:: caixaEnvolvente() const {     return Caixa(Posição(posição().x() - raio(),                      posição().y() - raio()),               Dimensão(2.0 * raio(), 2.0 * raio()); } double Círculo:: raio() const     return raio_; 2003/2004 Programação Orientada para Objectos

30 Classe abstracta Forma
class Forma { public: Forma(Posição const& posição); virtual ~Forma() = 0; virtual double área() const = 0; virtual double perímetro() const = 0; Posição const& posição() const; virtual Caixa const caixaEnvolvente() const = 0; virtual void movePara(Posicão const& nova_posição); private: Posição posição_; }; Classe abstracta: classe com operações abstractas. Destrutor abstracto. Operações abstractas. 2003/2004 Programação Orientada para Objectos

31 Forma: métodos Forma::Forma(Posição const& posição)     : posição_(posição) {} Forma::~Forma() Posição const& Forma::posição() const {     return posição_; } void Forma::movePara(Posição const& nova_posição)     posição_ = nova_posição; Apesar de abstracto, o destrutor tem de ser implementado. 2003/2004 Programação Orientada para Objectos

32 Forma Classes abstractas e operações abstractas ou puramente virtuais em itálico. Alternativamente pode-se usar: -posição_: Posição «constructor» +Forma(posição: Posição) «query» +área(): double +perímetro(): double +Posição(): Posição +caixaEnvolvente(): Caixa «update» +movePara(nova_posição: Posição) «query» = inspector Forma {abstract} «update» = modificador Quadrado Círculo -raio_: double «constructor» +Círculo(posição: Posição, raio: double) «query» +área(): double +perímetro(): double +caixaEnvolvente(): Caixa +raio(): double

33 Mais algumas notas... Uma declaração de uma rotina membro indica a presença de uma operação da classe Uma definição de uma rotina membro indica a presença de um método que implementa uma operação da classe Uma operação abstracta não precisa de ser definida Uma classe que declare uma operação abstracta, diz-se também uma classe abstracta Uma classe sem quaisquer operações abstractas é uma classe concreta Uma classe derivada que herde das classes base operações abstractas, só é concreta se fornecer métodos que implementem cada uma dessas operações Uma classe abstracta não pode ser instanciada 2003/2004 Programação Orientada para Objectos

34 Aula 8: Sumário Categorias de acesso: acesso protegido
Polimorfismo e operações polimórficas ou virtuais Operações polimórficas Destrutores polimórficos Ligação estática vs. dinâmica Distinção entre operação e método Classes e operações abstractas Operações abstractas ou puramente virtuais Classes abstractas Classes concretas 2003/2004 Programação Orientada para Objectos


Carregar ppt "Aula 8 Polimorfismo."

Apresentações semelhantes


Anúncios Google