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

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

1 Aula 8 Polimorfismo. 2003/2004 Programação Orientada para Objectos 2 protected Acesso mais limitado que public Acesso menos limitado que private Membros.

Apresentações semelhantes


Apresentação em tema: "1 Aula 8 Polimorfismo. 2003/2004 Programação Orientada para Objectos 2 protected Acesso mais limitado que public Acesso menos limitado que private Membros."— Transcrição da apresentação:

1 1 Aula 8 Polimorfismo

2 2003/2004 Programação Orientada para Objectos 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

3 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 { public: void mostra() const { cout << a << endl; } };

4 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; }

5 2003/2004 Programação Orientada para Objectos 5 … e Chefe. 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; } Classe base. Classe derivada. é um Chefe::mostra() oculta Empregado::mostra().

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

7 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.

8 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

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

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

11 2003/2004 Programação Orientada para Objectos 11 Operações polimórficas 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. Classe polimórfica.

12 2003/2004 Programação Orientada para Objectos 12 Operações polimórficas 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_; }; Sobreposição: fornecimento de um método especializado para a classe derivada que implementa a operação da classe base. A assinatura tem de ser exactamente igual! Classe polimórfica.

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

14 2003/2004 Programação Orientada para Objectos 14 Distinção entre operação e método Operação 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

15 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

16 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

17 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 subordinados; }; void Chefe::subordina(Empregado* const subordinado) { subordinados.push_back(subordinado); }

18 2003/2004 Programação Orientada para Objectos 18 Chefe com subordinados list 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 ::iterator i = pessoal.begin(); i != pessoal.end(); ++i) (*i)->mostra(); … for(list ::iterator i = pessoal.begin(); i != pessoal.end(); ++i) delete *i; É invocado o destrutor de Empregado.

19 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 ).

20 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

21 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 { … };

22 2003/2004 Programação Orientada para Objectos 22 Veículos: representação Veículo AutomóvelMotociclo HondaNX650AudiTT Conceitos abstractos. Conceitos concretos.

23 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 { public: 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; private: Posição posição_; Dimensão dimensão_; };

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

25 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_; };

26 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 { return ???; } 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; }

27 2003/2004 Programação Orientada para Objectos 27 Classe Forma 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.

28 2003/2004 Programação Orientada para Objectos 28 Classe Círculo 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.

29 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_; }

30 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_; }; Operações abstractas. Classe abstracta: classe com operações abstractas. Destrutor abstracto.

31 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.

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

33 2003/2004 Programação Orientada para Objectos 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

34 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


Carregar ppt "1 Aula 8 Polimorfismo. 2003/2004 Programação Orientada para Objectos 2 protected Acesso mais limitado que public Acesso menos limitado que private Membros."

Apresentações semelhantes


Anúncios Google