Beruflich Dokumente
Kultur Dokumente
Conceitos e Tcnicas
Polimorfismo
Prof.
Linguagens de Programao
Linguagens de Programao
Linguagens de Programao
Polimorfismo
Linguagens de Programao
Linguagens de Programao
Polimorfismo
Linguagens de Programao
Tipos de Polimorfismo
Classificao de Cardelli e Wegner
Ad-hoc
Coero
Polimorfismo
Sobrecarga
Universal
Paramtrico
Incluso
Polimorfismo
Linguagens de Programao
Tipos de Polimorfismo
Ad-hoc
Se aplica apenas a subprogramas
Aparentemente proporciona reuso do cdigo de
implementao do subprograma, mas na realidade
no o faz
So criados subprogramas especficos para operar
sobre cada tipo admissvel
Somente proporciona reuso do cdigo de chamada
dos subprogramas
Polimorfismo
Linguagens de Programao
Tipos de Polimorfismo
Universal
Se aplica a subprogramas e estruturas de
dados
estrutura
de
dados
pode
ser
criada
incorporando elementos de tipos diversos
mesmo cdigo pode ser executado e atuar sobre
elementos de diferentes tipos
Linguagens de Programao
10
Coero
Converso implcita de tipos
void f (float i) { }
main() {
long num;
f (num);
}
Linguagens de Programao
11
Coero
Ampliao
Tipo de menor conjunto de valores para tipo de maior
conjunto
Operao segura pois valor do tipo menor necessariamente
tem correspondente no tipo maior
Estreitamento
Tipo de maior conjunto de valores para tipo de menor
conjunto
Operao insegura pois pode haver perda de informao
Nem sempre ampliao ou estreitamento
int para unsigned em C
Polimorfismo
Linguagens de Programao
12
Coero
Do a entender que determinada operao ou subprograma pode
ser realizada com operandos de tipos diferentes mas no isso
o que ocorre
main() {
int w = 3;
float x;
float y = 5.2;
x = x + y;
x = x + w;
Polimorfismo
Linguagens de Programao
13
Coero
Ocorre com grande frequncia em atribuies e expresses em
C
main() {
int i;
char c = a;
float x;
i = c;
c = i + 1;
x = i;
i = x / 7;
}
Polimorfismo
Linguagens de Programao
14
Coero
Existem opinies controversas a seu respeito
Maior redigibilidade por no demandar chamada de
funes de converso
Menor confiabilidade pois podem impedir a
deteco de certos tipos de erros por parte do
compilador
main() {
int a, b = 2, c = 3;
float d;
d = a * b;
a = b * d;
}
Polimorfismo
// d = (float) (a * b) ;
// a = b * c;
Linguagens de Programao
15
Coero
ADA e MODULA-2 no admitem coeres
Python admite apenas entre tipos numricos
C adota uma postura bastante permissiva
JAVA busca um meio termo s admitindo a realizao
de coeres para tipos mais amplos
byte a, b = 10, c = 10;
int d;
d = b;
c = (byte) d;
a = (byte) (b + c);
Polimorfismo
Linguagens de Programao
16
Sobrecarga
Quando identificador ou operador usado
para designar duas ou mais operaes
distintas
Aceitvel quando o uso do operador ou
identificador no ambguo
A operao apropriada pode ser identificada
usando-se as informaes do contexto de aplicao
Polimorfismo
Linguagens de Programao
17
Sobrecarga
Operador de C pode designar
Negaes inteiras
(int int ou short short ou long long)
Negaes reais
(float float ou double double)
Subtraes inteiras
(int x int int)
Subtraes reais
(float x float float)
Conjunto de operaes pode ser muito maior
Polimorfismo
Linguagens de Programao
18
Sobrecarga
Sugere que determinada operao ou
subprograma pode ser realizada com
operandos de tipos diferentes mas no isso
que ocorre
main(){
int a = 2, b = 3;
float x = 1.5, y = 3.4;
a = a + b;
//
x = x + y;
//
}
Polimorfismo
Linguagens de Programao
19
Sobrecarga
MODULA-2 e C
Embutem sobrecarga em seus operadores
Programadores no podem implementar novas
sobrecargas de operadores
No existe qualquer sobrecarga de subprogramas
PASCAL
Existem
subprogramas
sobrecarregados
na
biblioteca padro
read e write
Programadores no podem implementar novas
sobrecargas de subprogramas
Polimorfismo
Linguagens de Programao
20
Sobrecarga
JAVA
Embute sobrecarga em operadores e em subprogramas de
suas bibliotecas
S subprogramas
programador
podem
ser
sobrecarregados
pelo
ADA e C++
Adotam a postura mais ampla e ortogonal
Realizam e permitem que programadores realizem sobrecarga
de subprogramas e operadores
No admitem a criao de novos operadores
Sintaxe e precedncia no pode ser alterada
Polimorfismo
Linguagens de Programao
21
Sobrecarga em C++
class umValor {
int v;
public:
umValor() { v = 0; }
umValor(int j) { v = j; }
const umValor operator+(const umValor& u)const {
return umValor(v + u.v);
}
umValor& operator+=(const umValor& u) {
v += u.v;
return *this;
}
Polimorfismo
Linguagens de Programao
22
Sobrecarga em C++
const umValor& operator++() { // prefixado
v++;
return *this;
}
const umValor operator++(int) { // posfixado
umValor antes(v);
v++;
return antes;
}
};
Polimorfismo
Linguagens de Programao
23
Sobrecarga em C++
main() {
int a = 1, b = 2, c = 3;
c += a +b;
umValor r(1), s(2), t;
t += r + s;
r = ++s;
s = t++;
}
Linguagens de Programao
24
Sobrecarga
Independente de Contexto
Lista de parmetros diferenciada em nmero ou tipo dos
parmetros
Tipo de retorno no pode ser usado para diferenciao
JAVA e C++
Dependente de Contexto
Necessrio apenas uma assinatura diferenciada
Tipo de retorno pode ser usado para diferenciao
Exige mais esforo dos compiladores
Pode provocar erros de ambigidade
ADA
Polimorfismo
Linguagens de Programao
25
Sobrecarga Independente de
Contexto
void f(void) { }
void f(float) { }
void f(int, int) { }
void f(float, float) { }
// int f(void) { }
main() {
f();
f(2.3);
f(4, 5);
f(2.2f, 7.3f);
// f(3, 5.1f);
// f(1l, 2l);
}
Polimorfismo
Linguagens de Programao
26
Sobrecarga Dependente de
Contexto
/ designa
diviso real (float x float float)
diviso inteira (integer x integer integer)
x: = 7/2;
n: = 7/2;
-- calcula 7/2 = 3
Linguagens de Programao
27
Sobrecarga
Nem todos consideram uma caracterstica
desejvel a possibilidade dos programadores
sobrecarregarem os operadores
Programas podem ficar mais fceis de serem
lidos e redigidos com a sobrecarga
Aumenta a complexidade da LP
Pode ser mal utilizado, tendo efeito contrrio
a legibilidade
Polimorfismo
Linguagens de Programao
28
Sobrecarga
JAVA no inclui a sobrecarga de
operadores por consider-la capaz de
gerar confuses e aumentar a
complexidade da LP
Python s permite sobrecarga de
operadores em mtodos de classes
Considera que lista de parmetros varivel
suficiente para prover funcionalidade
equivalente a sobrecarga
Polimorfismo
Linguagens de Programao
29
Paramtrico
Parametrizao das estruturas de dados e subprogramas com
relao ao tipo do elemento sobre o qual operam
Abstraes recebem um parmetro implcito adicional
especificando o tipo sobre o qual elas agem
Subprogramas especficos para cada tipo do elemento
int identidade (int x) {
return x;
}
Subprogramas genricos
T identidade (T x) {
return x;
}
Polimorfismo
Linguagens de Programao
30
Politipo
Subprogramas genricos possuem parmetro tipo
T parmetro tipo em T identidade (T x)
Tipo retornado por identidade ser o mesmo usado na
chamada
x = identidade (3.2);
// x receber um float
Polimorfismo
Linguagens de Programao
31
Paramtrico em C++
Uso de template
template <class T>
T identidade (T x) {
return x;
}
class tData {
int d, m, a;
};
Polimorfismo
main () {
int x;
float y;
tData d1, d2;
x = identidade (1);
y = identidade (2.5);
d2 = identidade (d1);
// y = identidade (d2);
}
Linguagens de Programao
32
Paramtrico em C++
Muitas funes so parcialmente genricas
template <class T>
T maior (T x, T y) {
return x > y ? x : y;
}
class tData {
int d, m, a;
};
main ( ) {
tData d1, d2;
printf ("%d", maior (3, 5));
printf ("%f", maior (3.1, 2.5));
// d1 = maior (d1, d2);
}
Linguagens de Programao
33
Paramtrico em C++
possvel parametrizar classes
template <class T, int tam>
class tPilha {
T elem[tam];
int topo;
public:
tPilha(void) { topo = -1; }
int vazia (void) { return topo == -1; }
void empilha (T);
void desempilha (void);
T obtemTopo (void);
};
Polimorfismo
Linguagens de Programao
34
Paramtrico em C++
template <class T, int tam>
void tPilha<T, tam>::empilha (T el){
if (topo < tam-1)
elem[++topo] = el;
}
template <class T, int tam>
void tPilha<T, tam>::desempilha (void){
if (!vazia()) topo--;
}
template <class T, int tam>
T tPilha<T, tam>::obtemTopo (void) {
if (!this->vazia()) return elem[topo];
}
Polimorfismo
Linguagens de Programao
35
Paramtrico em C++
class tData {
void main () {
tData d1, d2;
int d, m, a;
};
Polimorfismo
Linguagens de Programao
36
Paramtrico em C++
Implementao de template em C++
S possibilita a reutilizao de cdigo fonte
No possvel compilar o cdigo usurio
separadamente do cdigo de implementao
O compilador C++ necessita saber quais tipos sero
associados ao template
Faz varredura do cdigo usurio
replica todo o cdigo de implementao para cada tipo
utilizado
Linguagens de Programao
37
Paramtrico
ADA
Pacotes Genricos
JAVA
Generics
Python
Totalmente polimrfico paramtrico
Valores carregam seus parmetros tipo
Polimorfismo
Linguagens de Programao
38
Incluso
Caracterstico de linguagens orientadas a
objetos
Uso de hierarquia de tipos para criao de
subprogramas e estruturas de dados
polimrficas
Idia Fundamental
Elementos dos subtipos so tambm elementos do
supertipo
Abstraes formadas a partir do supertipo podem
tambm envolver elementos dos seus subtipos
Polimorfismo
Linguagens de Programao
39
Incluso
S subtipo de T implica
S formado por um sub-conjunto dos valores
de T
Todo valor de S tambm um valor de T
Herana
Subclasses herdam os atributos e mtodos de
uma classe e, portanto, implementam subtipos
do tipo definido por essa classe
Herana associa subclasse
uma representao inicial para os objetos dessa
classe (os atributos herdados)
um conjunto inicial de mtodos aplicveis aos
objetos dessa classe (os mtodos herdados)
41
Herana em JAVA
public class Pessoa {
private String nome;
private int idade;
public Pessoa (String n, int i) {
nome = n;
idade = i;
}
public void aumentarIdade () {
idade++;
}
}
Polimorfismo
Linguagens de Programao
42
Herana em JAVA
public class Empregado extends Pessoa {
private float salario;
public Empregado (String n, int i, float s) {
super(n, i);
salario = s;
}
public void mudarSalario (float s) {
salario = s;
}
}
Polimorfismo
Linguagens de Programao
43
Herana em JAVA
public class Empresa {
public static void main(String[] args) {
Pessoa p = new Pessoa (Denise, 34);
p.aumentarIdade();
Empregado e1 = new Empregado (Rogerio, 28, 1000.00);
e1.mudarSalario(2000.00);
e1.aumentarIdade();
}
}
Polimorfismo
Linguagens de Programao
44
Vantagens da Herana
Aumenta a reusabilidade do cdigo
Desnecessrio redefinir os atributos e
mtodos da classe Pessoa na classe
Empregado
Linguagens de Programao
45
Linguagens de Programao
46
Linguagens de Programao
47
Polimorfismo
Linguagens de Programao
48
Inicializao de Atributos
com Herana
Necessrio inicializar atributos da superclasse antes
dos da classe
Em JAVA
class Estado {
Estado(String s) {
System.out.println(s);
}
}
class Pessoa {
Estado p = new Estado("Ativo");
Pessoa () {
System.out.println("Pessoa");
Linguagens de Programao
}
Polimorfismo
}
49
Inicializao de Atributos
com Herana
class Idoso extends Pessoa {
Estado i = new Estado("Sabio");
Idoso () {
System.out.println("Idoso ");
}
}
class Avo extends Idoso {
Estado a1 = new Estado ("Alegre");
Avo() {
System.out.println("Avo");
a3 = new Estado ("Orgulhoso");
}
Estado a2 = new Estado
("Amigo");
Linguagens
de Programao
Polimorfismo
50
Inicializao de Atributos
com Herana
void fim() {
System.out.println("Fim");
}
Estado a3 = new Estado ("Satisfeito");
}
public class Inicializacao {
public static void main(String[] args) {
Avo a = new Avo();
a.fim();
}
}
Polimorfismo
Linguagens de Programao
51
Sobrescrio
Mtodo herdado no adequado para realizar a
mesma operao nos objetos das subclasses
class XY {
protected int x = 3, y = 5;
public int soma () {
return x + y;
}
}
class XYZ extends XY {
int z = 17;
public int soma () {
return x + y + z;
Linguagens de Programao
}
Polimorfismo
}
52
Sobrescrio
public class Sobrescrita {
public static void main (String[] args) {
XYZ xyz = new XYZ();
System.out.println(xyz.soma());
}
}
Linguagens de Programao
53
Linguagens de Programao
54
Ampliao ou Upcast
Instncia
Objetos de uma classe
Membro
Todas as instncias da classe e de suas subclasses
Ampliao em JAVA
public class Empresa {
public void paga (Pessoa pes) {}
public void contrata (Empregado emp) {}
public static void main(String[] args) {
Pessoa p = new Pessoa ("Lucas", 30);
Empregado e = new Empregado ("Luis", 23, 1500.00);
p = e;
// e = p;
Empresa c = new Empresa();
c.paga(e);
// c.contrata(p);
}
Polimorfismo
Linguagens de Programao
56
Ampliao em C++
S atravs de ponteiros ou referncias
Pessoa p, *q;
Empregado e, *r;
q = r;
// r = q;
// p = e;
// e = p;
Linguagens de Programao
57
58
Linguagens de Programao
59
Polimorfismo
Linguagens de Programao
60
idade: 28
PESSOA
salario: 1000.00
psuper
aumentarIdade
imprime
EMPREGADO
psuper
imprime
Polimorfismo
Linguagens de Programao
61
Amarrao Tardia x
Amarrao Esttica em C++
Todas chamadas utilizam amarrao tardia em JAVA
Em C++ o implementador da classe pode decidir se
deseja o uso de amarrao tardia ou no para cada
mtodo da classe
Visa no comprometer a eficincia de execuo
desnecessariamente
Uso da palavra virtual
class Pessoa {
public:
void ler(){}
Polimorfismo
};
62
de
cdigo
usurio
class Militar {
void operacao(){}
}
class Exercito extends Militar {
void operacao(){System.out.println(Marchar);}
}
class Marinha extends Militar {
void operacao(){System.out.println(Navegar);}
}
class Aeronautica extends Militar {
Linguagens de Programao
Polimorfismo void operacao(){System.out.println(Voar);}
}
com
63
Classes Abstratas
Possuem membros, mas no possuem instncias
Membros so as instncias de suas subclasses
concretas (no abstratas)
Proibida a criao de instncias dessas classes
Linguagens de Programao
65
Classes Abstratas
Em JAVA
Uso de especificador abstract
abstract class Militar {
void operacao(){}
}
Linguagens de Programao
66
Mtodos Abstratos
Mtodos declarados na classe, mas no
implementados
A implementao desses mtodos deixada para as
subclasses
Polimorfismo
67
Polimorfismo
Linguagens de Programao
68
Polimorfismo
Linguagens de Programao
69
Linguagens de Programao
70
Linguagens de Programao
71
Linguagens de Programao
72
Estreitamento ou Downcast
Termo usado para descrever a converso de
tipos de objetos no sentido da superclasse
para as subclasses
No completamente seguro para o sistema de
tipos porque um membro da superclasse no
necessariamente do mesmo tipo da subclasse
para a qual se faz a converso
Algumas LPs no permitem o estreitamento
Outras exigem que ele seja feito atravs de uma
operao de converso explcita
Polimorfismo
Linguagens de Programao
73
Estreitamento ou Downcast
JAVA somente permite a realizao de
estreitamento atravs de converso explcita
Caso a converso seja feita entre classes no
pertencentes a uma mesma linha de descendncia na
hierarquia, ocorrer erro de compilao
Caso a converso seja na mesma linha de
descendncia, mas o objeto designado pela
superclasse no seja membro da classe para o qual
se faz o estreitamento, ocorrer uma exceo em
tempo de execuo
O operador instanceof permite testar dinamicamente
se o objeto designado
pela
superclasse realmente 74
Linguagens de
Programao
Polimorfismo
da classe para a qual se deseja fazer a converso
Estreitamento em JAVA
class UmaClasse {}
class UmaSubclasse extends UmaClasse {}
class OutraSubclasse extends UmaClasse{}
public class Estreitamento {
public static void main (String[] args) {
UmaClasse uc = new UmaSubclasse();
UmaSubclasse us = (UmaSubclasse) uc;
OutraSubclasse os;
// os = (OutraSubclasse) us;
// os = (OutraSubclasse) uc;
if (uc instanceof OutraSubclasse) os = (OutraSubclasse) uc;
}
}
Linguagens de Programao
75
Polimorfismo
Estreitamento em C++
Converso explcita tradicional
Feita em tempo de compilao sem qualquer
verificao
cast
Linguagens de Programao
76
Estreitamento em C++
Converso explcita dinmica
Feita em tempo de execuo
Verifica se converso para o tipo correto
dynamic_cast
Linguagens de Programao
77
Estreitamento em C++
#include <typeinfo>
class UmaClasse {
public:
virtual void temVirtual () {}
};
class UmaSubclasse: public UmaClasse {};
class OutraSubclasse: public UmaClasse {};
class OutraClasse {};
main () {
// primeira parte do exemplo
UmaClasse* pc = new UmaSubclasse;
OutraSubclasse* pos = dynamic_cast <OutraSubclasse*> (pc);
Linguagens de Programao
Polimorfismo
UmaSubclasse* ps = dynamic_cast
<UmaSubclasse*> (pc);
78
Estreitamento em C++
// segunda parte do exemplo
UmaSubclasse us;
pc = static_cast <UmaClasse*> (&us);
pc = &us;
OutraClasse* poc = (OutraClasse*) pc;
// OutraClasse* poc = static_cast <OutraClasse*> (pc);
// terceira parte do exemplo
if (typeid(pc) == typeid(ps))
ps = static_cast<UmaSubclasse*>(pc);
if (typeid(pc) == typeid(pos))
pos = static_cast<OutraSubclasse*>(pc);
Polimorfismo
}
Linguagens de Programao
79
Herana Mltipla
Pessoa
Professor
Aluno
Empregado
ProfessorAluno
Herana Simples
Herana Mltipla
Polimorfismo
Linguagens de Programao
80
Herana Mltipla
LPs com herana simples
Composio
Uso de mtodos envoltrios
Impede subtipagem mltipla
class Professor {
String n = Marcos;
int matr = 53023;
public String nome() { return n; }
public int matricula() { return matr; }
}
class Aluno {
String n = Marcos;
Linguagens de Programao
Polimorfismo
int matr = 127890023;
81
Herana Mltipla
float coef = 8.3;
public String nome() { return n; }
public int matricula() { return matr; }
public float coeficiente() { return coef; }
}
class ProfessorAluno extends Professor {
Aluno aluno = new Aluno();
public float coeficiente() {
return aluno.coeficiente();
}
public int matriculaAluno() {
return aluno.matricula();
}
Linguagens de Programao
Polimorfismo
}
82
Herana Mltipla
LPs com herana mltipla
Resolvem problema de subtipagem mltipla
No precisam de mtodos envoltrios
Problemas
Conflito de Nomes
Herana Repetida
Em C++
class Aluno {
float nota;
public:
Polimorfismo void imprime();Linguagens de Programao
};
83
Conflito de Nomes
class Professor {
float salario;
public:
void imprime();
};
class ProfessorAluno: public Professor, public Aluno { };
main() {
ProfessorAluno indeciso;
// indeciso.imprime();
}
Polimorfismo
Linguagens de Programao
84
Conflito de Nomes
Sobrescrio resolve
class ProfessorAluno: public Professor, public Aluno {
public:
void imprime();
};
void ProfessorAluno::imprime() {
Aluno::imprime();
}
main() {
ProfessorAluno indeciso;
indeciso.imprime();Linguagens de Programao
Polimorfismo
85
Herana Repetida
Academico
Professor
Academico
Aluno
Academico
ProfessorAluno
Polimorfismo
Aluno
Professor
Academico
Academico
Linguagens de Programao
86
Herana Repetida
Duplicao desnecessria de atributos
Conflito de Nomes
Uso de virtual em C++
class Academico {
int i;
int m;
public:
int idade ( ) { return i; }
int matricula ( ) { return m; }
};
Polimorfismo
Linguagens de Programao
87
Herana Repetida
class Professor: virtual public Academico {
float s;
public:
float salario ( ) { return s; }
};
class Aluno: virtual public Academico {
float coef;
public:
float coeficiente ( ) { return coef; }
};
class ProfessorAluno: public Professor, public Aluno {};
Polimorfismo
Linguagens de Programao
88
Linguagens de Programao
89
Linguagens
de Programao x) { x.opera(); }
neuroCirurgia
(NeuroCirurgiao
90
91
Composio X Herana
Composio
Quando se quer as caractersticas de uma classe, mas
no sua interface
Objeto utilizado para implementar a funcionalidade
da nova classe
Relacionamento do tipo tem-um
Herana
Alm de usar as caractersticas, a classe herdeira
tambm usa a interface da classe herdada
Relacionamento do
tipo -um
Linguagens de Programao
Polimorfismo
92
Linguagens de Programao
93