Sie sind auf Seite 1von 93

Linguagens de Programao

Conceitos e Tcnicas

Polimorfismo
Prof.

Verificao Esttica de Tipos


Todos os parmetros e variveis devem possuir um
tipo fixo identificvel a partir da anlise do texto
do programa
Tipo de cada expresso pode ser identificado e
cada operao pode ser verificada em tempo de
compilao
C faz poucas verificaes
Reduz confiabilidade
MODULA-2 faz muitas verificaes
Reduz redigibilidade
Polimorfismo

Linguagens de Programao

Verificao Dinmica de Tipos


Em tempo de execuo
Somente os valores dessas LPs tm tipo fixo
Cada valor tem associado a ele um tag indicando
o seu tipo
Uma varivel ou parmetro no possui um tipo
associado
Pode designar valores de diferentes tipos em
pontos distintos da execuo
Verificao
dos
tipos
de
operandos
imediatamente antes da execuo da operao
LISP, BASIC, APL e SMALLTALK
Polimorfismo

Linguagens de Programao

Verificao de Tipos Mista


Maior parte das verificaes de tipos
em tempo de compilao
Algumas verificaes em tempo de
execuo
Programas em LPs orientadas a objetos
podem precisar verificar a converso de
tipos de objetos durante a execuo

C++, ADA e JAVA


Polimorfismo

Linguagens de Programao

Sistemas de Tipos Monomrficos


Todas constantes, variveis e subprogramas devem ser definidos
com um tipo especfico
PASCAL e MODULA-2
Simples mas com baixa reusabilidade e redigibilidade
Muitos algoritmos e estruturas de dados so inerentemente
genricos
Algoritmo para ordenao independe parcialmente do tipo do
elemento a ser ordenado
Tipo do elemento precisa ter operao de comparao
Conjuntos e suas operaes so totalmente independentes do
tipo dos elementos

Polimorfismo

Linguagens de Programao

Sistemas de Tipos Monomrficos


Nenhuma LP totalmente monomrfica
PASCAL
read, readln, write, writeln e eof
Vetores, conjuntos, arquivos
PASCAL e MODULA-2
Operadores (como +) atuam sobre diversos tipos
Linguagens monomrficas exigem que se crie
representao e operaes distintas para cada tipo
de elemento
Lista de inteiros, lista de cadeia de caracteres, etc
Polimorfismo

Linguagens de Programao

Sistemas de Tipos Polimrficos


Favorecem a construo e uso de estruturas de dados e
algoritmos que atuam sobre elementos de tipos diversos
Subprogramas polimrficos so aqueles cujos parmetros (e,
no caso de funes, o tipo de retorno) podem assumir valores
de mais de um tipo
Tipos de dados polimrficos so aqueles cujas operaes so
aplicveis a valores de mais de um tipo
C
void* possibilita a criao de variveis e parmetros cujos
valores podem ser ponteiros para tipos quaisquer
possibilita a construo de estruturas de dados genricas

funes com lista de parmetros varivel tambm so


polimrficas

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

Proporciona reuso de cdigo tanto na


chamada quanto na implementao
Considerado o verdadeiro polimorfismo
Polimorfismo

Linguagens de Programao

10

Coero
Converso implcita de tipos
void f (float i) { }
main() {
long num;
f (num);
}

f aparenta lidar com float e long


De fato, f lida apenas com float
Compilador se encarrega de embutir cdigo para
transformar long em float

C possui tabela de converses permitidas


Polimorfismo

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 = somafloat (x, y)

x = x + w;

// x = somafloat (x, intToFloat (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;

//

a = somaint (a, b);

x = x + y;

//

x = somafloat (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++;
}

til na criao de objetos em diferentes contextos


Sintaxe esquisita para sobrecarga de ++ e
Nem todos operadores podem ser sobrecarregados
:: (resoluo de escopo), . (seleo de membro), sizeof
(tamanho do objeto/tipo) no podem
Polimorfismo

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);

No pode diferenciar


apenas
por tipo de
retorno
// int f(void) { }

Pode gerar ambigidade


quando combinada com
coero
 // 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)

Ambigidade mesmo sem coero

Sobrecarga de / (integer x integer float)


function / (m,n : integer) return float is begin
return float (m) / float (n);
end /;
n : integer; x : float;
x: = 7.0/2.0;

-- calcula 7.0/2.0 = 3.5

x: = 7/2;

-- calcula 7/2 = 3.5

n: = 7/2;

-- calcula 7/2 = 3

n: = (7/2) / (5/2); -- calcula (7/2)/(5/2) = 3/2 = 1


x: = (7/2) / (5/2); -- erro: ambiguidade (pode ser 1.4 ou 1.5)
Polimorfismo

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

Tipo de identidade sua assinatura T T


Tipo como T T chamado de politipo porque pode derivar
uma famlia de muitos tipos
No existe impedimento em se usar mais de um parmetro tipo
em um politipo

U x T T indica que parmetros podem ser de tipos


distintos e que o tipo retornado ser o tipo do segundo

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

Erro de compilao porque o operador > no est definido para


a classe tData
Necessrio sobrecarregar o operador > para a classe tData
Polimorfismo

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;

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();
}
}

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

Compilador necessita verificar se o tipo usado


compatvel com as operaes definidas nas
implementaes e saber o tamanho a ser alocado
Polimorfismo

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

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
Linguagens de Programao
40
Polimorfismo
objetos

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
de Programaoda subclasse
comportamentoLinguagens
dos objetos
Polimorfismo

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

Herana polimorfismo universal


o mtodo aumentarIdade(), usado para
mudar a idade de uma Pessoa, e tambm
aplicado para mudar a idade de um
Empregado
Polimorfismo

Linguagens de Programao

45

Especificador de Acesso para


Classes Herdeiras
Algumas situaes requerem que classes
herdeiras tenham acesso livre aos atributos
da classe herdada
A alternativa de fazer esses atributos
pblicos ou criar mtodos pblicos de acesso
pode no ser satisfatria porque torna esses
atributos e mtodos acessveis para mtodos
de qualquer outra classe
protected: novo especificador de acesso para
classes herdeiras
Polimorfismo

Linguagens de Programao

46

Especificador de Acesso para


Classes Herdeiras em JAVA
public class Pessoa {
protected int idade;
}
public class Empregado extends Pessoa {
public Empregado (int i) { idade = i; }
public boolean aposentavel() {
if (idade >= 65) return true;
return false;
}
}
Polimorfismo

Linguagens de Programao

47

Especificador de Acesso para


Classes Herdeiras em JAVA
public class Empresa {
public static void main(String[] args) {
Empregado e = new Empregado (32);
if (e.aposentavel()) System.out.println(Chega de trabalho!);
// e.idade = 70;
}
}

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());
}
}

Extenso de mtodo na sobrescrio


class XYZ extends XY {
int z = 17;
public int soma () {
return super.soma() + z;
}
Polimorfismo

Linguagens de Programao

53

Identificao Dinmica de Tipos


Forma de identificar o tipo do objeto
em tempo de execuo
til em situaes nas quais o programador
desconhece o tipo verdadeiro de um objeto
permite elaborao de trechos de cdigo
nos quais mtodos invocados por um mesmo
referenciador de objetos se comportam de
maneira diferenciada
Polimorfismo

Linguagens de Programao

54

Ampliao ou Upcast
Instncia
Objetos de uma classe

Membro
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
Linguagens de Programao
55
Polimorfismo
subclasse para
as superclasses

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;

Limitao consequncia do mecanismo de


cpia de objetos utilizado pela operao de
atribuio e para passagem de parmetros por
valor
Polimorfismo

Linguagens de Programao

57

Amarrao Tardia de Tipos

Definio dinmica do mtodo a ser executado

Depende do objeto que invoca o mtodo


class Pessoa {
String nome;
int idade;
public Pessoa (String n, int i) {
nome = n;
idade = i;
}
public void aumentaIdade () { idade++; }
public void imprime(){
System.out.print(nome + " , " + idade);
Linguagens de Programao
Polimorfismo }
}

58

Amarrao Tardia de Tipos


class Empregado extends Pessoa {
float salario;
Empregado (String n, int i, float s) {
super(n, i);
salario = s;
}
public void imprime(){
super.imprime();
System.out.print(" , " + salario);
}
}
Polimorfismo

Linguagens de Programao

59

Amarrao Tardia de Tipos


public class Empresa {
public static void main(String[] args) {
Pessoa p = new Empregado (Rogerio, 28, 1000.00);
p.aumentaIdade();
p.imprime();
}
}

 Menos eficiente que amarrao esttica

Polimorfismo

Linguagens de Programao

60

Amarrao Tardia de Tipos


pclasse
nome:Rogerio

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

};

virtual void imprimir()


{} Programao
Linguagens de

62

Amarrao Tardia de Tipos


Possibilita a criao
polimorfismo universal

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

Amarrao Tardia de Tipos


public class Treinamento {
public static void treinar(Militar[] m) {
for (int i = 0; i < m.length; i++) {
m[i].operacao();
}
}
public static void main (String[] args) {
Militar[] m = new Militar[] {
new Exercito(), new Marinha(), new Aeronautica(),
new Militar()
}
treinar(m);
Linguagens de Programao
64
Polimorfismo }
}

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
Polimorfismo

Linguagens de Programao

65

Classes Abstratas
Em JAVA
Uso de especificador abstract
abstract class Militar {
void operacao(){}
}

Provocaria erro de compilao no exemplo


apresentado anteriormente
Na construo de Militar
Polimorfismo

Linguagens de Programao

66

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
Linguagens de Programao
Devem ser implementados
pelas subclasses
concretas

Polimorfismo

67

Classes e Mtodos Abstratos


Em JAVA
abstract class Militar {
String patente;
Militar(String p) { patente = p; }
String toString() { return patente; }
abstract void operacao();
}

Polimorfismo

Linguagens de Programao

68

Classes e Mtodos Abstratos


Em C++
class Militar {
public:
virtual void operacao()=0;
void imprime { cout << Militar; }
};

Polimorfismo

Linguagens de Programao

69

Especificao por Classe Abstrata


abstract class Forma {
abstract void mover(int dx, int dy);
abstract void desenhar();
}
class Circulo extends Forma {
int x, y, raio;
Circulo (int x, int y, int r) {
this.x = x;
this.y = y;
raio = r;
}
Polimorfismo

Linguagens de Programao

70

Especificao por Classe Abstrata


void mover(int dx, int dy) {
x += dx;
y += dy;
}
void desenhar() {
System.out.println (Circulo:);
System.out.println ( Origem: ( + x + , + y +));
System.out.println ( Raio: + raio);
}
}
Polimorfismo

Linguagens de Programao

71

Classes Abstratas Puras


Todos os mtodos so abstratos
Usadas para disciplinar a construo de classes
JAVA define o conceito de interface para a
sua implementao
No possuem atributos de instncia
Mtodos so todos pblicos e abstratos
interface Forma {
void mover(int dx, int dy);
void desenhar();
}
Polimorfismo

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

Converso explcita esttica


Feita em tempo de compilao
Verifica se converso ocorre em uma linha
de descendncia
static_cast
Polimorfismo

Linguagens de Programao

76

Estreitamento em C++
Converso explcita dinmica
Feita em tempo de execuo
Verifica se converso para o tipo correto
dynamic_cast

Teste dinmico de tipos


Feito em tempo de execuo
Verifica qual o tipo referenciado por
ponteiro
Polimorfismo
typeid

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

Herana Mltipla em JAVA


No permite herana mltipla de classes
Usa o conceito de interfaces para permitir
subtipagem mltipla
interface Aluno {
void estuda();
void estagia();
}
class Graduando implements Aluno {
public void estuda() {}
public void estagia() {}
}
Polimorfismo

Linguagens de Programao

89

Herana Mltipla em JAVA


interface Cirurgiao { void opera(); }
interface Neurologista { void consulta(); }
class Medico { public void consulta() {} }
class NeuroCirurgiao extends Medico implements Cirurgiao,
Neurologista {
public void opera() { }
}
public class Hospital {
static void plantoCirurgico (Cirurgiao x) { x.opera(); }
static void atendimentoGeral (Medico x) { x.consulta(); }
static void neuroAtendimento (Neurologista x) { x.consulta(); }
static void
Polimorfismo

Linguagens
de Programao x) { x.opera(); }
neuroCirurgia
(NeuroCirurgiao

90

Herana Mltipla em JAVA


public static void main(String[ ] args) {
NeuroCirurgiao doutor = new NeuroCirurgiao();
plantoCirurgico(doutor);
atendimentoGeral(doutor);
neuroAtendimento(doutor);
neuroCirurgia(doutor);
}
}

No existem problemas de conflito de nomes e


herana repetida
Dificulta a reutilizao de cdigo pois limita a
Linguagens de Programao
Polimorfismo
herana aos prottipos dos mtodos

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

Estruturas de Dados Genricas


Polimorfismo Paramtrico
C++
Compilador garante homogeneidade dos elementos

Polimorfismo por Incluso


JAVA
Uso de Object
Simplifica a LP
Necessidade de Estreitamento
Polimorfismo

Linguagens de Programao

93

Das könnte Ihnen auch gefallen