Aula 8 Polimorfismo.

Slides:



Advertisements
Apresentações semelhantes
Classes C++ Class nome da classe { private: membros privados
Advertisements

List templates Vamos considerar a lista ligada (singly linked list) O objecto da classe slink O objecto da classe slink O objecto da classe slink NULL.
1. Classes 2. Membros estáticos 1.1. Palavra chave this
Vamos abordar o exemplo
Mutação Orientada a Objeto para Assegurar a Qualidade de Testes Baseado no Artigo: Object-Oriented Mutation to Asses the Quality of Tests Anna Derezinska.
Iniciação ao Java – Márcio F. Campos
Templates Traduzido de:
Capítulo 13 Pacotes. 2 Capítulo 13 – Pacotes Pacotes Pacote Cláusula package Cláusula import Executando uma classe de pacote Modificadores de acesso.
Orientação a Objetos Classes
Centro Integrado de Tecnologia da Informação
Curso de C/C++ Avançado
Capítulo 9 Herança 1.
1 Aula 5 Instâncias dinâmicas. 2003/2004 Programação Orientada para Objectos 2 Instâncias… int j = 20; int f() { int const i = 10; // … } Constante automática.
Matrizes clássicas e vectores em C++
1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.
Aula 7 Instrução de iteração while. 2003/2004 Introdução à Programação 2 passo [G][G] [¬G][¬G] Início da actividade Fim da actividade Actividade Transição.
2002/2003 Programação Orientada para Objectos 1 Aula 7 - Herança Herança pública: relação é um. A relação tem um. A relação é composto por um. Ponteiros,
Aula 11 Tipos Abstractos de Dados II. 2003/2004 Introdução à Programação 2 Estrutura global do programa #include using namespace std; int mdc(int const.
Aula 10 Tipos Abstractos de Dados I. 2003/2004 Introdução à Programação 2 Flashback Lembram-se da Aula 4?
2002/2003 Programação Orientada para Objectos 1 Aula 11: Genericidade Genericidade usando herança Conceito de rotina genérica Conceito de classe genérica.
Programação Orientada para Objectos
1 Aula 3 Listas e iteradores (cont.). 2003/2004 Programação Orientada para Objectos 2 ListaDeInt : interface class ListaDeInt { public: typedef int Item;
Metodologia de Dijkstra para desenvolvimento de ciclos
Aula 6 Instruções de selecção e instruções condicionais.
1 Aula 7 Herança. 2003/2004 Programação Orientada para Objectos 2 Conceitos fundamentais: Herança Polimorfismo Ligação dinâmica.
1 Aula 6 Classes que reservam recursos externos. 2003/2004 Programação Orientada para Objectos 2 PilhaDeInt : interface /** Representa pilhas de int.
Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas
Aula 13 Tipos Abstractos de Dados IV. 2003/2004 Introdução à Programação 2 Estrutura global do programa (I) Construtores Inspectores.
2002/2003 Programação Orientada para Objectos 1 Aula 5 Memória livre e instâncias dinâmicas Criação de instâncias dinâmicas Destruição de instâncias dinâmicas.
2002/2003 Programação Orientada para Objectos 1 Aula 4 Memória, unidade básica de memória e conceito de endereço Ponteiros Relação de ponteiros com matrizes.
2002/2003 Programação Orientada para Objectos 1 Aula 3 Utilização de listas Melhorando a implementação das listas e iteradores Reflexão sobre interfaces.
Aula 2 Listas e iteradores.
Linguagem de Programação II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
O Mecanismo de Threads em Java 2. Criar uma classe herdeira da super classe Thread public class minhaThread extends Thread{ public class minhaThread extends.
Herança em C#.
Programação Orientada a Objetos com Java
Introdução à Ciência da Computação-2 Fabio Nakano – Por favor colocar no assunto: ICC2 - – Bloco A-1, segundo andar,
Classes Revisando: –Forma de implementação de estruturas específicas –Atributos (grupos de dados) –Métodos (conjuntos de procedimentos)
Linguagens de Programação – DEL-Poli/UFRJ Prof. Miguel Campista Linguagens de Programação Prof. Miguel Elias Mitre Campista
Const member functions
JAVA Orientação a Objetos
METODOLOGIA PARA DESENVOLVIMENTO DE SISTEMAS Prof. Dr. rer. nat. Daniel D. Abdala 1.
Linguagem de Programação II
Atributos, Encapsulamento e Interface em Java
Herança em Java.
if669 - Introdução à Programação
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Programação orientada a objectos em C++
Desenvolvimento de Jogos e Entretenimento Digital Oficina temática: Algoritmos e Programação Orientação a Objetos: herança Professor: Sandro Rigo.
2002/2003 Programação Orientada para Objectos 1 Aula 6 Classes que reservam recursos externos Problemas comuns Construtores e destrutores Construção por.
Implementação Orientada a Objetos – Aula 03
Programação Orientada à Objetos
2002/2003 Programação Orientada para Objectos 1 Aula 2 Noção de lista e de iterador Operações com listas e iteradores Classes embutidas.
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Herança e Polimorfismos
Herança e Arquitetura em camadas
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Bruno Inojosa MCP .NET Framework
Programação Orientada à Objetos Aula 10 – Herança (Pratica)
Paradigmas da Programação – Semestre 1 – Aula 7 Professor: Eduardo Mantovani )
Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista POO para Redes de Computadores.
Implementação Orientada a Objetos – Aula 03 Atributos e Encapsulamento Prof. Danielle Martin/ Marcia Bissaco Universidade de Mogi das Cruzes
Implementação Orientada a Objetos – Aula 08 Herança, sobrescrita de métodos e polimorfismo Prof. Danielle Martin Universidade de Mogi das Cruzes
Implementação Orientada a Objetos – Aula 07 Agregação e composição de objetos Prof. Danielle Martin Universidade de Mogi das Cruzes
Implementação Orientada a Objetos – Aula 04 Métodos, parâmetros e retorno Prof. Danielle Martin/Marcia Bissaco Universidade de Mogi das Cruzes
Diagrama de Classes Modelagem e Programação Orientada a Objetos Curso Superior de Tecnologia em Sistemas para Internet Prof. Cristiano Stüpp Nunes
Orientação a Objetos - Programação em C++ Slides 11: Herança et al. (Funções Virtuais, Polimorfismo, Herança Múltipla, Funções Virtuais Puras e Classes.
PROGRAMAÇÃO ORIENTADA A OBJETOS EM C++ PAE: Pedro Shiguihara Professor: Dilvan Moreira.
Orientação a Objetos - Programação em C++
Transcrição da apresentação:

Aula 8 Polimorfismo

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

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

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

… 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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