Overloading e Overriding - parte 1

Documentos relacionados
FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Sub-rotinas em C. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Programação Java (nível intermediário) 4. Polimorfismo

Laboratório de programação II

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Material preparado pela profa Silvana Maria Affonso de Lara

AULA 8 Polimorfismo de: coerção, overloading, inclusão e paramétrico Prof. Dr. Fernando Henrique Campos

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Ponteiros e Tabelas. K&R: Capítulo 5

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

PCS3111. Laboratório de Programação Orientada a Objetos para Engenharia Elétrica. Aula 6: Polimorfismo

Linguagem de Programação II Implementação

Funções em C. Lucas Ferrari de Oliveira Professor Adjunto. Linguagem de Programação Estruturada I. Universidade Federal do Paraná

Linguagem de Programação C

Atributos e Métodos Estáticos

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Classes, Métodos e Propriedades

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Instituto Federal de Educação, Ciência e Tecnologia do Ceará IFCE Programa Educacional Brasileiro de Desenvolvimento para ios BEPiD PROVA OBJETIVA

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {

Classificação das linguagens de programação

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Análise de Programação

Lista de Linguagens de Programação 19

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Módulo 5. Programação Orientada a Objetos. Programação Orientada a Objetos I Java (Rone Ilídio)

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Classes e Objetos. Sintaxe de classe em Java

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

9 Classes Abstractas e Interfaces

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

ESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

4 Conceito de Herança

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Trabalho Linguagem e Programação de Compiladores

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Linguagem de Programação III

PLANO DE UNIDADE DIDÁTICA- PUD

Aula 6 POO 1 Construtores. Profa. Elaine Faria UFU

Estruturas de controle Parte 1

Algoritmos e Programação. Linguagem C Procedimentos e. Eliane Pozzebon

Relacionamentos entre objetos

Linguagem de Programação II Implementação

Polimorfismo. O que é polimorfismo?

ESTRUTURAS CONDICIONAIS. Introdução à Ciência da ComputaçãoI Simone Senger de Souza

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

1 Introdução e Conceitos básicos

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Programação: Vetores

Variáveis primitivas e Controle de fluxo

#include <stdio.h> main() { int i; // Cabeçalho for (i = 1; i <=20; i++) putchar( * ); putchar( \n ); puts( Numeros entre 1 e 5 );

Linguagem e Técnicas de Programação

Sabemos que a classe é responsável por definir a estrutura e o comportamento de seus objetos. Portanto, os objetos são instâncias das classes.

Transcrição:

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 1 Overloading e Overriding - parte 1! Overloading e Overriding são técnicas que, a partir de um nome de função ou método definido em uma chamada, seleciona para a execução uma determinada forma dentre diversas possíveis. Apesar dessa definição comum, overloading e overriding são mecanismos distintos. Overloading ocorre em tempo de compilação enquanto overriding ocorre em tempo de execução.! O compilador examina o contexto no qual o overloading está sendo utilizado e determina o corpo de função mais apropriado. Normalmente o aspecto mais crítico para essa tomada de decisão é o tipo de assinatura dos argumentos que estão sendo utilizados na chamada. Como essa seleção do corpo de função é feita em tempo de compilação, ela é estática.! De maneira geral, overloading também é chamado de ad hoc polymorphism e tem pouca relação com a Orientação a Objetos. Ele pode ser encontrado em diversas linguagens de programação não orientada a objetos, como por exemplo a linguagem C. Apesar disso, overloading é uma poderosa forma de polimorfismo.! Neste material, será apresentado o overloading. O overriding será apresentado no próximo material desta disciplina. 1. Overloading! A idéia chave para a compreensão do overloading é: i) o tipo de assinatura da função ou método e ii) escopo de uso.! O Tipo de Assinatura de Função ou Método é a descrição dos tipos de argumentos associados com a função, a ordem dos argumentos e o tipo de retorno da função.! O Escopo de Uso, por sua vez, define a parte do programa que a função ou método será usado ou a sua forma de uso. Duas funções diferentes podem ter variáveis locais de mesmo nome e não haverá confusão alguma nem overlap. Métodos podem ter o mesmo nome sem que ocorra ambiguidade.

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 2! Exemplo:!! class Math!!! int soma( int a) return a;!!! int soma (int a, int b) return (a+b);!!! int soma (int a, int b, int c) return (a+b+c);!! No Overloading, é importante destacar que a definição de qual corpo de método será executado em decorrência de uma chamada, é feita em tempo de compilação baseado no tipo estático dos valores dos argumentos. De maneira diferente do overriding, nenhum mecanismo de definição em tempo de execução é utilizado.! Supondo que existem dois métodos print. Um deles recebe como argumento uma instância de uma classe Pessoa e o outro método, uma instância da classe Aluno. A classe Aluno é filha da classe Pessoa. O Quadro a seguir apresenta o código C++ do exemplo descrito. Qual será o método a ser executado? Quadro 1 - Exemplo de Overloading class Pessoa private : string nome; public : void setnome(string v)nome = v; string getnome()return nome; ; class Aluno : public Pessoa ; void print(pessoa *p) std::cout << "Pessoa: "<< p->getnome() << "\n"; void print(aluno *a) std::cout << "Aluno: " << a->getnome() << "\n" ; int main(int argc, char** argv) Pessoa *alguem = new Aluno(); alguem->setnome("charles Mingus"); print(alguem);! O método que será executado será o primeiro, o definido no Quadro 1 na cor vermelha. A definição de qual função print será utilizada é estática. Ela ocorre em tempo de compilação.

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 3 1.1 Redefinição! Redefinição ocorre quando uma classe Filha define um método utilizando o mesmo nome de um método da classe Pai mas com uma assinatura diferente. A mudança no tipo de assinatura é o que diferencia a Redefinição do Overloading. Há dois modos de se tratar isso a saber: * Merge Mode : exemplo de linguagem que implementa o merge mode : Java. Para tratar uma chamada, todas as possíveis alternativas são examinadas e a alternativa mais próxima é a selecionada. * Hierarchical Mode : exemplo de linguagem que implementa o hierarquical mode. Na linguagem C++ cada escopo é mantido em uma lista separada. Para casar uma chamada de método com o método propriamente dito, cada escopo de lista é examinado de maneira sequencial. Ao localizar o nome do método, passa-se ao segundo passo que é analisar os argumentos.! Por exemplo, na linguagem Java, é permitido o seguinte código ilustrado no Quadro 2. Quadro 2 class Pai public void print(string nome)system.out.println("pai: " + nome); class Filho extends Pai public void print(string nome, int id) System.out.println("Filho: " + nome + " idade=" + id); public class Main public static void main(string[] args) Filho junior = new Filho(); junior.print("guerry Mulligan");! O método da classe Pai será selecionado e executado pois ele é quem melhor casa com a chamada do método.! O mesmo exemplo, se representado na linguagem C++ fornecerá um erro de compilação. O Quadro 3 apresenta o código em C++ desse exemplo. O Erro de Compilação ocorre por que o escopo correspondente à classe filha é examinado por

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 4 primeiro antes do escopo da classe pai. Um método com o mesmo nome é encontrado no escopo da classe filha, o método print. Ao analisar os argumentos, o compilador identifica que os argumentos do método localizado na classe filha são diferentes dos argumentos da chamada do método da função principal (main). Isso é interpretado como um erro, pois o compilador C++ realiza uma análize hierárquica. De maneira resumida, o compilador analisa o código, localiza o método print na classe Filho e verifica o casamento dos tipos de argumentos da chamada de função e da função localizada. Os tipos de argumento não casando é interpretado como erro de compilação.! Quadro 3 - O código a seguir apresentará um erro de compilação class Pai public: void print(string nome) cout << "Pai: " << nome; ; class Filho : public Pai public: void print(string nome, int id) cout << "Filho: " << nome << " idade=" << id; ; int main(int argc, char** argv) Filho *junior = new Filho(); junior->print("guerry Mulligan");! Para se resolver essa particularidade do Modo Hierarquico (Hierarchical Mode), o programador deverá redefinir o método da classe pai na classe filha. O Quadro 4 ilustra essa modificação com o código na cor vermelha e fonte em itálico.

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 5 Quadro 4 class Pai public: void print(string nome) cout << "Pai: " << nome; ; class Filho : public Pai public: void print(string nome, int id) cout << "Filho: " << nome << " idade=" << id; ; void print(string nome)pai::print(nome); int main(int argc, char** argv) Filho *junior = new Filho(); junior->print("guerry Mulligan"); 1.2 Polyadicity! Uma função polyadic é uma que recebe uma quantidade variável de argumentos. Por exemplo, na linguagem C, a função printf. Essa função pode ser chamada de acordo, mas não limitada aos seguintes exemplos: printf( Ivo viu a uva ); printf( O resultado da divisao entre %i e %i eh %f, 4,5,(4/5));!! Escrever uma chamada para uma função polyadic é fácil. A dificuldade reside em escrever o corpo dessa função. Por exemplo, como rotular uma quantidade indefinida de argumentos?! Na linguagem C/C++, por exemplo, a indicação que uma função receberá uma quantidade indefinida de argumentos é feita por... ( três pontos ). C/C++ utiliza um conceito denominado de ellipsis para implementar isso. Nesse conceito, deve-se utilizar um tipo de dado chamado (macro) va_list para uma lista de argumentos variáveis, e um trio de métodos (macros) va_start, va_arg e va_end. O endereço http:// www.cplusplus.com/reference/cstdarg/ fornece uma descrição a respeito de como utilizar o conceito ellipsis.

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 6! O Quadro 5, a seguir, exemplifica o conceito de ellipsis. Nesse exempplo, uma função somar deve realizar a soma de uma quantidade indefinida de números inteiros. No Quadro 5, a função somar recebe como primeiro parâmetro a quantidade de elementos que serão enviados, em seguida,... para indicar que uma seqüência de valores serão passados.! Uma variável listpointer é definida do tipo var_list. A função va_start (listpointer, quantidadedeelementos) inicializa um ponteiro interno para os dados enviados. Cada elemento da lista enviada é acessado por meio da função va_arg. Ao final do processo, fecha-se o ponteiro va_end.! #include <stdarg.h> Quadro 5 int somar(int quantidadedeelementos,...) int arg, saida = 0; va_list listpointer; va_start( listpointer, quantidadedeelementos ); int i = 0; for( int i = 0 ; i < quantidadedeelementos; i++ ) arg = va_arg( listpointer, int ); printf( " O %dth o.argumento eh %d\n", i, arg ); saida += arg; getchar(); va_end(listpointer); printf("a soma resulta %i \n", saida); return saida; int main(int argc, char** argv) somar(10, 2, 4, 5, 7, 8, 12, -2, 6, 13, 1);! O Quadro 6, por sua vez, exemplifica a passagem de instâncias de classes como parâmetros. Similar ao Quadro 5, a quantidade de elementos não é definida a priore.

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 7 #include <stdarg.h> Quadro 6 class Pessoa protected : string nome; public: void print() cout << "Pessoa: " << nome; Pessoa(string v)nome = v; Pessoa()nome="desconhecido"; ; void printfamilia(int n,...) va_list listpointer; va_start( listpointer, n ); int i = 0; for( int i = 0 ; i < n; i++ ) Pessoa *arg = va_arg( listpointer, Pessoa *); printf( " getchar(); va_end(listpointer); O %dth o.argumento eh ", (i+1) ); arg->print(); int main(int argc, char** argv) Pessoa *p1 = new Pessoa("Charlie Parquer"); Pessoa *p2 = new Pessoa("Michael Brecker"); Pessoa *p3 = new Pessoa("Coleman Hawkins"); printfamilia(3, p1, p2, p3); delete p1; delete p2; delete p3; 1.3 Parâmetros Opcionais!! Outra forma de definição de variação de parâmetros, é a definição de parâmetros que são opcionais. Nesse caso, a definição da função deverá explicitar um valor padrão para os parâmetros faltantes. Os parâmetros opcionais precisam aparecer por último na definição da função. O Quadro 7 apresenta um pequeno exemplo do conceito de Parâmetros Opcionais.

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 8 #include <climits> #include <stdio.h> #define minimo INT_MIN Quadro 7 int maior( int x, int y, int z = minimo) if ( z!= minimo) printf("valores recebido: %i, %i, %i \n", x, y, z); else printf("valores recebido: %i, %i \n", x, y); int saida = z; printf("saida %i \n", saida ); if (y > saida) saida = y; printf("saida = %i \n", saida ); if (x > saida) saida = x; printf("saida = %i \n", saida ); return saida; int main(int argc, char** argv) int a = 4; int b = 6; int c = 9; int maxv = maior(a,b,c); printf("o maior valor entre %i, %i, %i eh %i\n", a,b,c, maxv); printf("\n\n **** Proxima Comparacao:\n"); int maxv2 = maior(a,b); printf("o maior valor entre %i, %i eh %i \n", a,b, maxv2); 1.4 Polyadicity na Linguagem Java! O conceito de polyadicity é implementado na linguagem Java de maneira similar à linguagem C++ 1. No Quadro 8, o mesmo exemplo do Quadro 5 é adaptado para a linguagem Java. 1 Um especial agradecimento ao aluno Guilherme Riesemberg pelo exemplo de aplicação na linguagem Java em 10 de abril de 2013.

UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 9 public class Main Quadro 8 public static int somar(int... numeros) int saida = 0; for (int j : numeros) saida += j; return saida; public static void main(string[] args) System.out.println(somar(3,4,5,6,7,8,9)); 2. Exercício! Outro aspecto importante de programação é o conceito de multimétodos ou multimethods ou multiple dispatch. Como exercício voce deverá: Investigar o que é esse conceito e exemplificá-lo na linguagem C++ É possível implementar o conceito de multi-mehod na linguagem de programação Java? Se sim, como?