Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
7 Polimorfismo
Vtor E. Silva Souza
(vitor.souza@ufes.br)
http://www.inf.ufes.br/~vitorsouza
Departamento de Informtica
Centro Tecnolgico
Universidade Federal do Esprito Santo
Este obra foi licenciada sob uma Licena Creative Commons Atribuio 3.0 No Adaptada.
Contedo do curso
Introduo;
Amarraes;
Valores
e
tipos
de
dados;
Variveis
e
constantes;
Expresses
e
comandos;
Modularizao;
Polimorfismo;
Excees;
Concorrncia;
Avaliao
de
linguagens.
Tipos
de
dados
Definem
um
conjunto
de
valores
e
as
operaes
aplicveis
sobre
esses
valores;
Servem
fundamentalmente
para
oferecer
informaes
relevantes
aos
programadores
e
aos
compiladores
(ou
interpretadores)
sobre
os
dados
usados
pelos
programas.
Setembro 2015
Linguagens
de
mquina
No
tipadas porque
nessas
linguagens
existe
um
nico
tipo
representado
pela
palavra
da
memria;
Programar
significa
representar
tudo
(caracteres,
nmeros,
ponteiros,
estruturas
de
dados,
instrues
e
programas)
como
cadeias
de
bits.
Se
um
dado
usado
numa
operao
ADD,
pressupe-se
ser
um
nmero
Setembro 2015
Linguagens
de
mquina
Necessrio
uma
interpretao
externa
para
identificar
de
maneira
clara
o
que
est
sendo
representado
nos
programas;
Mesmo
em
linguagens
no
tipadas,
o
conceito
de
tipos
de
dados
surge
naturalmente
com
a
atividade
de
programao:
Nmeros,
caracteres
e
instrues
precisam
ser
tratados
de
maneira
distinta
pelo
programador.
Setembro 2015
Linguagens
de
mquina
Impossibilidade
de
evitar
violaes
na
organizao
dos
dados:
No
h
impedimento
para
o
programador
efetuar
a
atribuio
de
uma
instruo
a
algo
que
representava
um
nmero;
Ambos
so
cadeias
de
bits,
o
nico
tipo
realmente
reconhecido
por
essas
linguagens.
Setembro 2015
Setembro 2015
Setembro 2015
Sistemas
de
tipos
Servem
para
descrever
de
modo
mais
adequado
os
dados:
Aumenta
a
legibilidade
e
a
redigibilidade dos
programas;
Evitam
que
programas
executem
operaes
incoerentes:
Somar
um
inteiro
e
um
caractere.
Setembro 2015
Verificao
de
tipos
Atividade
de
garantir
que
operandos
de
um
certo
operador
so
de
tipos
compatveis;
Subprogramas &
parmetros
==
operadores
&
operandos;
Verificao
a
priori
de
tipos
normalmente
recomendada:
Evita
a
realizao
de
operaes
sem
sentido;
LPs
podem
possibilitar
ou
no
a
realizao
de
uma
ampla
verificao
de
tipos:
C
adota
uma
postura
fraca;
Ada
e
Java
procuram
realizar
uma
verificao
extremamente
ampla
de
tipos.
Setembro
2015
10
Verificao
de
tipos
Feita
antes
da
execuo
das
operaes;
Em
geral,
o
quanto
antes
melhor:
Erros
de
tipos
so
identificados
mais
cedo;
Nem
sempre
isso
possvel
ou
desejvel
(ex.:
ligao
dinmica
em
LPs
OO);
Algumas
LPs
possuem
brechas
no
seu
sistema
de
tipos
que
impedem
a
realizao
de
algum
tipo
de
verificao
Registro
variante
em
Pascal
e
Modula-2.
Setembro 2015
11
Setembro 2015
12
13
Setembro 2015
14
Setembro 2015
15
Aes
do
compilador:
Operandos
de
% devem
ser
inteiros;
Os
operandos
de
== devem
ser
de
um
mesmo
tipo;
O
tipo
de
retorno
de
par deve
ser
inteiro;
O
parmetro
real
de
par deve
ser
inteiro.
Setembro
2015
16
17
Resultado:
21
AbacaxiAbacaxiAbacaxi
18
Inferncia
de
tipos
LPs
estaticamente
tipadas no
devem
necessariamente
exigir
a
declarao
explcita
de
tipos:
par (n) {
return (n % 2 == 0);
}
main() {
i = 3;
par (i);
}
Qual o tipo do argumento
n? E qual o tipo de
retorno de par()?
Setembro 2015
19
Inferncia
de
tipos
Um
sistema
de
inferncia
de
tipos
pode
ser
usado
para
identificar
os
tipos
de
cada
entidade
e
expresso
do
programa:
Aumenta
redigibilidade,
mas
pode
reduzir
legibilidade
e
facilidade
para
depurao
dos
programas;
Compiladores
so
bem
mais
exigidos;
Haskell e
ML.
-- Em Haskell, esta linha opcional:
igualA1 :: Char -> Bool
-- O compilador infere a definio acima a partir de:
igualA1 c = c=='1'
Setembro
2015
20
Setembro 2015
21
Setembro 2015
22
Equivalncia
estrutural
Se
T e
T
so
primitivos,
ento
T e
T
devem
ser
idnticos:
inteiro
inteiro
Se
T e
Tso
produtos
cartesianos
e
T =
A
x B e
T=
A
x
B,
ento
A
A
e
B B:
inteiro
x booleano
inteiro
x booleano
Se
T e
Tso
unies
e
T =
A
+
B e
T=
A
+
B;
ento
A
A
e
B B
ou
A
B
e
B A:
inteiro
+
booleano
booelano +
inteiro
Se
T e
Tso
mapeamentos
e
T =
A
B e
T
=
A
B;
ento
A
A
e
B B:
inteiro
booleano
inteiro
booleano
Setembro
2015
23
Setembro 2015
24
25
26
27
Setembro 2015
28
29
Tipos
de
polimorfismo
Classificao
de
Cardelli e
Wegner:
Coero
Ad-hoc
Sobrecarga
Polimorfismo
Paramtrico
Universal
Incluso
Setembro 2015
30
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.
Coero
Setembro 2015
Sobrecarga
31
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;
Proporciona
reuso
de
cdigo
tanto
na
chamada
quanto
na
implementao;
Considerado
o
verdadeiro
polimorfismo.
Paramtrico
Setembro 2015
Incluso
32
Coero
(ad-hoc)
Converso
implcita
de
tipos:
void f (float i) { /* ... */ }
int main() {
long num;
f (num);
}
33
Coero
(ad-hoc)
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:
De
int para
unsigned em
C.
Setembro
2015
34
Coero
(ad-hoc)
Do
a
entender
que
determinada
operao
ou
subprograma
pode
ser
realizada
com
operandos
de
tipos
diferentes
mas
no
isso
o
que
ocorre:
int main() {
int w = 3;
float x = 0;
float y = 5.6;
x = x + y;
// x = somafloat(x, y)
x = x + w;
// x = somafloat(x, intToFloat(w))
w = x + y;
// w = floatToInt(somaFloat(x, y))
}
Setembro 2015
35
Coero
(ad-hoc)
Ocorre
com
grande
frequncia
em
atribuies
e
expresses
em
C:
int main() {
int i;
char c = a;
float x;
i = c;
c = i + 1;
x = i;
i = x / 7;
}
Setembro 2015
36
Coero
(ad-hoc)
Deve
se
ter
cuidado
com
perdas:
int main(int argc, char *argv[]) {
int i;
float j=2.5;
float k=1234.5*10000*10000;
i=j;
// i=2 j=2.500000
printf("i=%d\tj=%f\n",i,j);
i=k;
// i=-2147483648 k=123449999360.000000
printf("i=%d\tk=%f\n",i,k);
}
Setembro 2015
37
Coero
(ad-hoc)
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.
int main() {
int a, b = 2, c = 3;
float d, e;
d = a * b;
// Desnecessrio: d = (float)(a * b), :)
e = b * d;
// Se o desejado fosse: e = b * c ?
:(
}
Setembro 2015
38
Coero
(ad-hoc)
Ada
e
Modula-2
no
admitem
coeres;
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);
Setembro 2015
39
Sobrecarga
(ad-hoc)
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.
Setembro 2015
40
Sobrecarga
(ad-hoc)
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)
41
Sobrecarga
(ad-hoc)
Sugere
que
determinada
operao
ou
subprograma
pode
ser
realizada
com
operandos
de
tipos
diferentes
mas
no
isso
que
ocorre:
int main() {
int a = 2, b = 3;
float x = 1.5, y = 3.4;
a = a + b;
// a = somaint (a, b);
x = x + y;
// x = somafloat (x, y);
}
Setembro 2015
42
Sobrecarga
(ad-hoc)
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
(ex.:
read() e
write());
Programadores
no
podem
implementar
novas
sobrecargas
de
subprogramas.
Setembro 2015
43
Sobrecarga
(ad-hoc)
Java:
Embute
sobrecarga
em
operadores
e
em
subprogramas
de
suas
bibliotecas;
S
subprogramas
podem
ser
sobrecarregados
pelo
programador;
Ada,
C++
e
Python:
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.
Setembro
2015
44
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;
}
// Continua...
Setembro
2015
45
Sobrecarga
em
C++
const UmValor& operator++() { // prefixado
v++;
return *this;
}
const UmValor operator++(int) { // posfixado
UmValor antes(v);
v++;
return antes;
}
};
//
//
//
//
//
Setembro 2015
46
Sobrecarga
em
C++
til
na
criao
de
objetos
em
diferentes
contextos;
Sintaxe
esquisita
para
sobrecarga
de
++ e
--;
Nem
todos
operadores
podem
ser
sobrecarregados.
Excees
so:
:: (resoluo
de
escopo);
. (seleo
de
membro);
sizeof (tamanho
do
objeto/tipo).
Setembro 2015
47
Sobrecarga
(ad-hoc)
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
ambiguidade;
Ada.
Setembro
2015
48
f(void) { }
f(float) { }
f(int, int) { }
f(float, float) { }
49
50
Sobrecarga
(ad-hoc)
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;
Java
no
inclui
a
sobrecarga
de
operadores
por
consider-la
capaz
de
gerar
confuses
e
aumentar
a
complexidade
da
LP.
Setembro
2015
51
Paramtrico
(universal)
Parametrizao
das
estruturas
de
dados
e
subprogramas
com
relao
ao
tipo
do
elemento
sobre
o
qual
operam:
Abstraes
recebem
um
parmetro
implcito
adicio-
nal 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;
}
Setembro
2015
52
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
53
Paramtrico
em
C++
Uso
de
template:
template <class T>
T identidade (T x) {
return x;
}
class tData {
int d, m, a;
};
Setembro 2015
int main () {
int x;
float y;
tData d1, d2;
x = identidade (1);
y = identidade (2.5);
d2 = identidade (d1);
// y = identidade (d2);
}
54
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;
};
int main () {
tData d1, d2;
printf ("%d", maior(3, 5));
printf ("%f",
maior(3.1, 2.5));
// d1 = maior (d1, d2);
}
55
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);
};
Setembro 2015
56
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];
}
Setembro 2015
57
Paramtrico
em
C++
class tData {
int d, m, a;
};
int main () {
tData d1, d2;
tPilha <int, 3> x;
tPilha <tData, 2> y;
x.empilha (1);
y.empilha (d1);
x.empilha (3);
y.empilha (d2);
while (! x.vazia() || ! y.vazia()) {
x.desempilha();
y.desempilha();
}
}
Setembro
2015
58
59
Paramtrico
(universal)
Ada:
Pacotes
genricos;
Java:
Tipos
genricos
a
partir
do
Java
5.
public class Casulo<T> {
private T elemento;
public void colocar(T elem) {
elemento = elem;
}
public T retirar() {
return elemento;
}
}
Setembro 2015
60
61
62
Incluso
(universal)
Caracterstico
de
linguagens
orientadas
a
objetos;
Uso
de
hierarquia
de
tipos
para
criao
de
subprogramas
e
estruturas
de
dados
polimrficas;
Ideia
Fundamental:
Elementos
dos
subtipos
so
tambm
elementos
do
supertipo;
Abstraes
formadas
a
partir
do
supertipo
podem
tambm
envolver
elementos
dos
seus
subtipos.
Setembro 2015
63
Incluso
(universal)
S subtipo
de
T implica:
S formado
por
um
subconjunto
dos
valores
de
T:
todo
valor
de
S
tambm
um
valor
de
T;
As
operaes
associadas
ao
tipo
T so
aplicveis
ao
subtipo
S:
S herda
todas
as
operaes
do
tipo
T;
Conceito
de
tipo
implementado
atravs
de
classes
em
linguagens
orientadas
a
objetos.
Setembro 2015
64
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);
Subclasse
pode
conter
atributos
e
mtodos
adicionais,
especializando
o
estado
e
o
comportamento
dos
objetos
da
subclasse.
Setembro
2015
65
Herana
em
Java
public class Produto {
protected String nome;
protected double preco;
public Produto(String nome, double preco) {
this.nome = nome;
this.preco = preco;
}
public boolean ehCaro() {
return (preco > 1000);
}
/* Mtodos de acesso ... */
}
Setembro 2015
66
Herana
em
Java
public class Livro extends Produto {
private String autor;
private int paginas;
public Livro(String nome, double preco,
String autor, int paginas) {
super(nome, preco);
this.autor = autor;
this.paginas = paginas;
}
public boolean ehGrande() {
return (paginas > 200);
}
}
Setembro 2015
67
Herana
em
Java
public class Loja {
public static void main(String[] args) {
Produto p = new Produto("HD externo", 500);
System.out.println(l.ehCaro());
Livro l;
l = new Livro("Linguagem de Programao",
74.90, "Flvio Varejo", 334);
System.out.println(l.ehCaro());
System.out.println(l.ehGrande());
}
}
Setembro 2015
68
Vantagens
da
herana
Aumenta
a
reusabilidade do
cdigo:
Desnecessrio
redefinir
os
atributos
e
mtodos
da
classe
Produto na
classe
Livro;
Herana
polimorfismo
universal:
O
mtodo
ehCaro(),
usado
para
verificar
se
um
Produto
caro,
tambm
aplicado
para
verificar
o
mesmo
em
Livro.
Setembro 2015
69
70
71
Resultado:
Computador()
Cdigo 0
Notebook()
Setembro 2015
72
Setembro 2015
73
74
Setembro 2015
75
Setembro 2015
76
Ampliao
ou
upcast
Instncia
(ou
instncia
direta):
Objetos
de
uma
classe;
Membro
(ou
instncia
indireta):
Todas
as
instncias
da
classe
e
de
suas
subclasses;
permitido
atribuir
qualquer
membro
a
uma
referncia
classe;
Ampliao:
Termo
usado
para
descrever
o
movimento
de
objetos
na
sua
linha
de
ancestrais
no
sentido
da
subclasse
para
as
superclasses.
Setembro 2015
77
Ampliao
em
Java
public class Pessoa {
public void comprar(Produto p) { /* ... */ };
public void ler(Livro l) { /* ... */ };
public static void main(String[] args) {
Produto hd = new Produto("HD externo", 500);
Livro livro = new Livro("Linguagem de Programao",
74.90, "Flvio Varejo", 334);
Pessoa cliente = new Pessoa();
cliente.comprar(hd);
cliente.comprar(livro);
cliente.ler(livro);
// cliente.ler(hd) no.
}
}
Setembro
2015
78
Ampliao
em
C++
S
atravs
de
ponteiros
ou
referncias:
Produto p, *q;
Livro l, *r;
q = r;
// r = q;
// p = l;
// l = p;
Setembro 2015
79
80
Amarrao
tardia/dinmica menos
eficiente que a esttica.
Setembro 2015
81
pclasse
nome: Java
preo: 280.8
Produto
paginas: 334
psuper
produto
ehCaro()
getNome()
Livro
psuper
ehCaro()
Setembro 2015
82
Setembro 2015
83
Setembro 2015
84
Setembro 2015
85
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;
Deve
ser
necessariamente
estendida;
teis
quando
uma
classe,
ancestral
comum
para
um
conjunto
de
classes,
se
torna
to
geral
a
ponto
de
no
ser
possvel
ou
razovel
ter
instncias
dessa
classe.
Setembro 2015
86
Setembro 2015
87
Mtodos
abstratos
Mtodos
declarados
na
classe,
mas
no
implementados:
A
implementao
desses
mtodos
deixada
para
as
subclasses;
Classes
abstratas
normalmente possuem
um
ou
mais
mtodos
abstratos;
Se
uma
classe
possui
um
mtodo
abstrato,
ela
deve
necessariamente ser
uma
classe
abstrata;
Especificam
protocolo
entre
a
classe
e
suas
subclasses;
Devem ser
implementados
pelas
subclasses
concretas.
Setembro 2015
88
Setembro 2015
89
90
Setembro 2015
91
Estreitamento
(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.
Setembro 2015
92
Estreitamento
(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
da
classe
para
a
qual
se
deseja
fazer
a
converso
Setembro
2015
93
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;
}
}
Setembro 2015
94
Estreitamento
em
C++
Converso
explcita
tradicional:
Feita
em
tempo
de
compilao
sem
qualquer
verificao;
cast.
Converso
explcita
esttica:
Feita
em
tempo
de
compilao;
Verifica
se
converso
ocorre
em
uma
linha
de
descendncia;
static_cast.
Setembro 2015
95
Estreitamento
em
C++
Converso
explcita
dinmica:
Feita
em
tempo
de
execuo
(como
Java);
Verifica
se
converso
para
o
tipo
correto,
retorna
nulo
caso contrrio;
Funciona
apenas
em
classes
com
funes virtuais;
dynamic_cast;
Teste
dinmico
de
tipos:
Feito
em
tempo
de
execuo
(como
o
instanceof);
Verifica
qual
o
tipo
referenciado
por
ponteiro
typeid.
Setembro
2015
96
Estreitamento
em
C++
#include <typeinfo>
class UmaClasse {
public:
virtual void temVirtual () {}
};
class UmaSubclasse: public UmaClasse {};
class OutraSubclasse: public UmaClasse {};
class OutraClasse {};
int main () {
// Primeira parte do exemplo:
UmaClasse* pc = new UmaSubclasse;
OutraSubclasse* pos =
dynamic_cast <OutraSubclasse*> (pc);
UmaSubclasse* ps = dynamic_cast <UmaSubclasse*> (pc);
Setembro 2015
97
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);
}
Setembro 2015
98
Herana
mltipla
Algumas
vezes
queremos
herdar comportamento
de
duas classes:
Setembro 2015
99
Herana
mltipla
Algumas
LPs
no
permitem
herana
mltipla:
// No permitido em Java, pois no tem herana mltipla:
class ProfessorAluno extends Professor, Aluno {
}
Alternativas:
Composio;
Uso
de
mtodos
envoltrios;
Impede
subtipagem mltipla.
Setembro 2015
100
Setembro 2015
101
Herana
mltipla
Algumas
LPs
do
suporte
herana
mltipla:
Resolvem
problema
de
subtipagem mltipla;
No
precisam
de
mtodos
envoltrios;
Possveis
problemas:
Conflito
de
nomes;
Herana
repetida.
Setembro 2015
102
Herana
mltipla
C++,
ao
contrrio
de
Java,
permite
a
herana
mltipla:
class Surf {
time_t data;
float notas[10];
public:
void registrarNota(float nota);
};
class Vela {
time_t data;
float tempos[10];
public:
void registrarTempo(float tempo);
};
Subclasse herda
ambos os mtodos
103
No h coliso de atributos
se os mesmos forem privativos
Coliso de nomes
gerando ambiguidade.
104
Ou:
void WindSurf::ordena() {
// N = competio por nota; T = por tempo.
if (competicao == 'N' )
Surf::ordena();
else
Vela::ordena();
}
Setembro
2015
105
106
107
Metaclasses
Classes
cujas
instncias
so
outras
classes:
Atributos
so
os
mtodos,
instncias
e
as
superclasses
das
classes
instncias
da
metaclasse;
Os
mtodos
normalmente
oferecem
servios
aos
programas
de
aplicao,
tais
como,
retornar
os
conjuntos
de
mtodos,
instncias
e
superclasses
de
uma
dada
classe;
Java
possui
uma
nica
metaclasse,
chamada
de
Class.
Setembro 2015
108
Metaclasse em
Java
import java.lang.reflect.*;
class Info {
public void informa(){}
public int informa(Info i, int x) { return x; }
}
class MetaInfo {
public static void main(String args[])
throws Exception {
Class info = Info.class;
Method metodos[] = info.getMethods();
Info i = (Info)info.newInstance();
Method m = info.getDeclaredMethod("informa", null);
m.invoke(i, null);
}
}
Setembro
2015
109
Metaclasses
Nvel
nico:
todos
objetos
so
vistos
como
classes
e
todas
as
classes
so
vistas
como
objetos;
Dois
Nveis:
todos
objetos
so
instncias
de
uma
classe,
mas
classes
no
so
acessveis
por
programas;
Trs
Nveis:
todos
objetos
so
instncias
de
uma
classe
e
todas
as
classes
so
instncias
de
uma
nica
metaclasse;
Vrios
Nveis:
podem
existir
vrias
metaclasses.
Setembro 2015
110
Setembro 2015
111
Setembro 2015
112
Concluses
Importncia
do
sistema
de
tipos;
Sistemas
de
tipos
polimrficos
aumentam
possibilidade
de
reutilizao;
Destaque
para
o
polimorfismo
de
incluso,
fundamental
no
paradigma
OO.
Setembro 2015
113
http://nemo.inf.ufes.br/
Setembro 2015
114