Sei sulla pagina 1di 15

6/5/12

POLIMORFISMO

MDULO ANTERIOR DO TUTORIAL: HERANA

3. POLIMORFISMO, CLASSES ABSTRATAS


Existem vrias classificaes e tipos de polimorfismo. C++ apresenta vrios tipos de polimorfismo . Java apresenta um conjunto mais reduzido evitando principalmente polimorfismos ad-hoc. Polimorfismo, do grego: muitas formas. Polimorfismo a capacidade de um operador executar a ao apropriada dependendo do tipo do operando. Aqui operando e operador esto definidos num sentido mais geral: operando pode significar argumentos atuais de um procedimento e operador o procedimento, operando pode significar um objeto e operador um mtodo, operando pode significar um tipo e operador um objeto deste tipo.

3.1. REDEFINIO DE MTODOS PARA UMA CLASSE HERDEIRA


Este exemplo j foi apresentado em 2.1.3. Tambm trata-se de um polimorfismo, pode ser classificado como polimorfismo de incluso. Um mtodo uma redefinio de um mtodo herdado, quando est definido em uma classe construda atravs de herana e possui o mesmo nome, valor de retorno e argumentos de um mtodo herdado da classe pai. A assinatura do mtodo tem que ser idntica, ou seja, teremos redefinio quando uma classe filha fornece apenas uma nova implementao para o mtodo herdado e no um novo mtodo. Se a classe filha fornecer um mtodo de cabealho ou assinatura parecida com a do mtodo herdado (difere ou no nmero ou no tipo dos argumentos, ou ento no tipo do valor de retorno) ento no se trata mais de redefinio, trata-se de uma sobrecarga, pois criou-se um novo mtodo. Uma chamada ao mtodo herdado no mais interceptada por esse novo mtodo de mesmo nome. O mtodo tem o mesmo nome, mas ligeiramente diferente na sua assinatura (o corpo ou bloco de cdigo {} no importa), o que j implica que no proporciona o mesmo comportamento (behaviour) do mtodo da superclasse.

3.2. SOBRECARGA ( MTODOS E OPERADORES)


Este tipo de polimorfismo permite a existncia de vrios mtodos de mesmo nome, porm com assinaturas levemente diferentes ou seja variando no nmero e tipo de argumentos e no valor de retorno. Ficaria a cargo do compilador escolher de acordo com as listas de argumentos os procedimentos ou mtodos a serem executados.

3.2.1. SOBRECARGA DE MTODOS, "COPY CONSTRUCTOR"


No exemplo a seguir vamos sobrecarregar o construtor de uma classe, esta classe passar a ter duas verses de construtores, vale lembrar que assim como o construtor ser sobrecarregado, qualquer outro mtodo poderia ser. O compilador saber qual mtodo chamar no mais pelo nome, mas pelos argumentos. O mtodo Ponto(Ponto ap); um "copy constructor", pois tem o mesmo nome que Ponto(float dx,float dy);. Tal duplicao de nomes pode parecer estranha, porm Java permite que eles coexistam para uma mesma classe porque no tem a mesma assinatura (nome+argumentos). Isto se chama sobrecarga de mtodo, o compilador sabe distinguir entre esses dois construtores. Outros mtodos, no s construtores podero ser sobrecarregados para vrios argumentos diferentes, esse recurso um polimorfismo do tipo "ad-hoc". O que interessante para ns o fato de o argumento do construtor Ponto(Ponto ap); ser da mesma classe para qual o construtor foi implementado, o que caracteriza um "copy constructor" que inicializa um objeto a partir de outro da mesma classe. Outros mtodos semelhantes seriam: Circulo(Circulo a); Mouse(Mouse d); . Implementar copy constructor pode ser muito importante, lembre-se dos problemas com cpias de objetos apresentados em 1.3.3. Por questes de espao, basearemos nosso exemplo no tipo abstrato de dados frao, apresentado em 1.6.1. Voc deve modificar a classe Fracao para que ela tenha dois construtores, o que esta em negrito dever ser acrescentado ao cdigo original:

pbi Faa(n us)/sbeag d cntuo oiia ulc rcoit mo /orcra o osrtr rgnl

nmus; u=mo

dn1 /sbnedd e=; /uetnio

pbi Faa(rcocpee /es e u cp cntutr ulc rcoFaa oim) /se ' m oy osrco euasbeag m orcra

nmcpeertranm) u=oim.eon_u(;

dmcpeertradn) e=oim.eon_e(;

pbi Faa(n titm /cntuo oiia ulc rcoit ,n ) /osrtr rgnl

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

1/15

6/5/12

POLIMORFISMO

nmt u=;

dnm e=;

ti.ipiia) /caaapr omsoojt. hssmlfc(; /hmd aa em beo

/Oporm picpl sbeamdfccoe ngio / rgaa rnia, or oiiaa m ert

casPicpl{ ls rnia

pbi sai vi mi(tigag[) ulc ttc od anSrn rs]

Faa abc rco ,,;

anwFaa() /eiieosgnoagmno =e rco5; /lmn eud ruet

bnwFaa(,) =e rco26;

Sse.u.rn(Et e afaa a "; ytmotpit"sa ' rco : )

amsr(; .ota)

Sse.u.rn(Et e afaa b "; ytmotpit"sa ' rco : )

bmsr(; .ota)

casm() =.oab;

Sse.u.rn(" d ab ";/cab ytmotpit c e +: ) /(+)

cmsr(; .ota)

Sse.u.rn(ab "; ytmotpit"*: )

camlilccob; =.utpiaa()

cmsr(; .ota)

Sse.u.rn(ab "; ytmotpit"+: )

casm() =.oab;

cmsr(; .ota)

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

2/15

6/5/12

POLIMORFISMO

Sse.u.rn(a=:"; ytmotpit">b )

Sse.u.rnl(.aooiulb) ytmotpitnamiruga();

Sse.u.rn(a=:"; ytmotpit"=b )

Sse.u.rnl(.ga(); ytmotpitnaiulb)

Sse.u.rn(a=:"; ytmotpit"!b )

Sse.u.rnl(.ieet(); ytmotpitnadfrneb)

Sse.u.rn((n) "; ytmotpit"ita )

Sse.u.rnl(.ovren() ytmotpitnacnetit);

Sse.u.rn((obea"; ytmotpit"dul) )

Sse.u.rnl(acnetdl); ytmotpitn .ovreb()

Et e afaa a (/) sa ' rco : 51 Et e afaa b (/) sa ' rco : 13 cd ab (63 e +: 1/) ab (/) *: 53 ab (63 +: 1/) a=:tu >b re a=:fle =b as a=:tu !b re (n) 5 ita (obea5 dul)

Teste o "copy constructor" para o tipo abstrato de dados frao apresentado acima. Quando um s nmero for passado para o construtor desta classe, subentende-se que o construtor chamado o de um s argumento inteiro e que portanto o denominador ser igual a 1. Agora vamos falar do "copy constructor", que embora implementado, no foi testado em main() . Esse mtodo, pertence a outro objeto que no o argumento copieme, ento para distinguir o atributo num deste objeto, do atributo num de copieme usamos copieme.num e simplesmente num para o objeto local, objeto em questo, ou objeto dono do mtodo chamado. Exerccios: 1Faa um "copy constructor" para uma das classes j implementadas neste texto. 2Sobrecarregue o mtodo move da classe Ponto para aceitar um Ponto como argumento, subentende-se que devemos mover a distncia x e a distncia y daquele ponto a origem. 3Crie um mtodo de nome unitarizado para a classe Ponto. Este mtodo deve interpretar o Ponto como um vetor e retornar um novo Ponto que contm as coordenadas do vetor unitarizado. Unitarizar dividir cada coordenada pelo mdulo do vetor. O mdulo a raiz quadrada da soma dos quadrados das componentes.
www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38 3/15

6/5/12

POLIMORFISMO

3.2.2. SOBRECARGA DE OPERADOR


Java no fornece recursos para sobrecarga de operador, o que perfeitamente condizente com a filosofia da linguagem. Seus criadores que acreditavam que a linguagem deveria ser pequena, simples, segura de se programar e de se usar (simple, small, safe and secure). A ausncia de sobrecarga de operadores pode ser contornada definindo apropriadamente classes e mtodos.

3.3. CLASSES ABSTRATAS E CONCRETAS


Em um dos exerccios anteriores (no tpico sobre herana) pedamos que voc definisse uma hierarquia composta de trs classes. A classe pai tinha o nome de Forma, e as classes herdeiras desta eram Ponto e Retangulo. Embora a classe forma no possusse sentido prtico, ela permitia certas operaes como move, altera_x(int nx), entre outras (retorne a este exerccio). Na verdade o que desejvamos era que esta classe Forma se comportasse como um esqueleto para as suas classes filhas, ns no queramos instanci-la. Classes abstratas permitem exatamente isto pois no podem ser instanciadas embora possam ser usadas de outras maneiras. Classes abstratas so poderosas, elas permitem: criao de listas heterogneas, ocorrncia de "dynamic binding" e maior clareza no projeto de sistemas. Os packages que vem com a linguagem esto repletos de exemplos de classes abstratas. Mtodos abstratos, obrigatoriamente pertencem a classes abstratas, e so mtodos desprovidos de implementao, so apenas definies que sero aproveitadas por outras classes da hierarquia. Voltando ao exemplo da hierarquia Forma, Ponto e Retangulo. O mtodo mostra poderia ter sido definido na classe base abstrata (Forma) como um mtodo abstrato.

Cassasrts lse btaa /Cas Fra /lse om

asrc casFra{ btat ls om

poetdfotxy /vsvlheaqi aax rtce la ,; /iie irrua bio

pbi vi mv(la d,la d) ulc od oefot xfot y

ti.+d;ti.+d; hsx=x hsy=y

asrc pbi vi msr(;/mtd asrt btat ulc od ota) /eoo btao

/Cas pno /lse ot

casPnoetnsFra{ ls ot xed om

pbi Pnofota,la a)/oiaovlrd rtro ulc ot(la xfot y /mt ao e eon!

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

4/15

6/5/12
/grneoetd d ojt /aat sao o beo

POLIMORFISMO

ti.=x ti.=y hsxa; hsya;

/mv nopeiasrrdfnd /oe a rcs e eeiio

pbi vi msr( ulc od ota)

Sse.u.rnl((+hsx""ti.+)) ytmotpitn""ti.+,+hsy"";

/Cas Rtnuo /lse eagl

casRtnuoetnsFra{ ls eagl xed om

poetdfotd,y /dlaxedlay rtce la xd; /et et

/poetdaaasnomnsifeie emi eiineqe /rtce cb ed eo nlxvl as fcet u piae rvt

pbi Rtnuofota,la a,la d,la d) ulc eagl(la xfot yfot xfot y

/grneoetd d ojt /aat sao o beo

xa;ya; =x =y

ti.xd;ti.yd;/ti uaopr eiia abgiae hsd=x hsd=y /hs sd aa lmnr miudd

/mtd mv nopeiasrrdfnd /eoo oe a rcs e eeiio

pbi vi msr( ulc od ota)

Sse.u.rnl((+hsx""ti.+)"d+,+y""; ytmotpitn""ti.+,+hsy"(+x""d+))

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

5/15

6/5/12
}

POLIMORFISMO

/Cas picpl AqioPicpljv /lse rnia, ruv rnia.aa

casPicpl{ ls rnia

pbi sai vi mi(tigag[){ ulc ttc od anSrn rs]

Rtnuoa=e Rtnuo001,4; eagl rnw eagl(,,31)

a.ota) rmsr(;

a.oe11; rmv(,)

a.ota) rmsr(;

(,)1,4 00(31) (,)1,4 11(31)

//COMENTARIOS: Observe que a classe Forma que abstrata, no possui um construtor, porque no pode ser instanciada. Agora tambm temos um novo qualificador de classe e de mtodos: abstract. Classes abstratas X Interfaces: Voc deve estar achando que classes abstratas e interfaces so conceitos parecidos e que podem ser usados com objetivos semelhantes. Cuidado! Uma classe pode estender uma nica classe (que pode ser abstrata ou no), mas pode implementar vrias interfaces. Alm disso, interfaces no permitem declarao de atributos, enquanto que classes abstratas permitem. Interfaces esto mais ligadas a comportamento, enquanto que classes abstratas esto mais ligadas a implementao. Exerccios: 1Defina uma classe abstrata tipo numrico que deve servir como classe base para a montagem de classes como a classe frao ou a classe nmero complexo. Uma boa medida da qualidade de sua implementao a quantidade de mudanas necessrias para por exemplo trocar a classe frao usada em um algoritmo de clculo numrico pela classe nmero complexo. bem verdade que existem operaes que se aplicam a uma dessas classes, mas no a outra, mas essas disparidades devero ser mantidas fora da classe base abstrata.

3.3.1. CLASSE ABSTRATA ITERADOR


Neste exemplo iremos criar uma classe base abstrata iterador, que servir como topo de uma hierarquia para iteradores de estruturas de dados como listas, vetores e rvores. O iterador de vetor definido por herana da classe base abstrata de iteradores. Perceba que alguns mtodos da classe base so desprovidos de implementao, porm nada impede que voc coloque como cdigo desses mtodos uma mensagem de erro do tipo "Erro, mtodo deveria ter sido redefinido", mas agora o compilador no pode mais te lembrar de redefini-los. "SHOPPING LIST APPROACH" PARA A CLASSE ABSTRATA ITERADOR (As operaes implementadas esto marcadas com , existem outras operaes teis, no mencionadas por motivos de espao. Esta classe base abstrata no tem a funcionalidade de uma classe que possa estar instanciada, perceba a ausncia de um mtodo para avanar na iterao).
www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38 6/15

6/5/12

POLIMORFISMO

Mtodo de inicializao da iterao Retorno do contedo da atual posio na iterao Atribuio de valor a atual posio da iterao Mtodo que verifica se a iterao no chegou ao fim "SHOPPING LIST APPROACH" PARA A CLASSE ABSTRATA ITERADOR VETOR (Uma tarefa desagradvel quando iterando sobre vetores manter os ndices das iteraes atualizados durante avanos e retrocessos. Note que retrocessos no fariam sentido em uma lista simplesmente ligada, por isso essa operao somente definida neste nvel da hierarquia.) Retorno do valor numrico ou ndice da atual posio da iterao Retrocesso na iterao Avano na iterao Avano e retrocesso com saltos (inclusive mais genrico que os dois anteriores).

/Cas IeaoI /lse trdr asrc casIeaoI{ btat ls trdr asrc pbi vi cmc(; btat ulc od oea) asrc pbi itrtra) /mtdsasrt btat ulc n eon(; /eoo btao asrc pbi vi arbiita; btat ulc od tiu(n ) asrc pbi boenfm) btat ulc ola i(; }

/Cas IeaoVtr /lse trdreoI casIeaoVtr etnsIeaoI{ ls trdreoI xed trdr poetdit]vt /ieosbeee rtce n[ e; /tr or l piaeitcna /pscoauld ieaa rvt n ot; /oia ta a trco pbi IeaoVtr(n[ ieee ulc trdreoIit] trm) { vtieee e=trm; cna0 ot=; }

pbi vi cmc( ulc od oea) { cna0 ot=; } pbi vi cmc(n p ulc od oeait ) { cna(%e.egh; ot=pvtlnt) } pbi vi arbiitnv) ulc od tiu(n oo { vtcna=oo e[ot]nv; }

pbi itrtra) ulc n eon( { rtr vtcna; eun e[ot] } pbi boenfm) ulc ola i( { rtr cna=e.egh1 eun ot=vtlnt-; }

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

7/15

6/5/12
pbi itrtracna) ulc n eon_ot( { rtr cna eun ot; } pbi vi aac( ulc od vna) { i (ot<vtlnt-) cna+ f cna(e.egh1) ot+; } pbi vi rtoee) ulc od ercd( { i (ot>)cnaf cna0 ot-; } }

POLIMORFISMO

ipr jv.oDtIpttem mot aai.aanuSra;

/Cas picpl AqioPicpljv /lse rnia, ruv rnia.aa

casPicpl{ ls rnia

pbi sai vi mi(tigag[){ ulc ttc od anSrn rs]

it]vtnwit6; n[ e=e n[]

vt0=;vt1=;vt2=;vt3=;vt4=;vt5=; e[]0 e[]1 e[]2 e[]3 e[]4 e[]5

IeaoVtr mtnwIeaoVtr(e) trdreoI i=e trdreoIvt;

ca o /ooco hr ; /=pa,

ite /tmoai n ; /eprro

Srn ln;/lnaasrld d tcao tig ie /ih e ia o eld

DtIpttemmuaanuSra=e DtIpttemSse.n; aanuSra eDtIpttemnw aanuSra(ytmi)

ty r{

d o

d {omuaanuSra.edie)caA() } o =eDtIpttemraLn(.hrt0;

wie(='n) hl o=\';

sic (){ wth o

cs '' /arbi ae a: /tiu

ln=eDtIpttemraLn(; iemuaanuSra.edie)

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

8/15

6/5/12
ty{ r

POLIMORFISMO

eItgrvlefln)itau(; =nee.auO(ie.nVle)

mtarbie; i.tiu()

cth(xeto er){ ac Ecpin ro

Sse.u.rnl(Etaaivld!) ytmotpitn"nrd naia";

bek ra;

cs '' /rtra ae r: /eon

emtrtra) =i.eon(;

Sse.u.rnl() ytmotpitne;

bek ra;

cs '' /fet ae f: /rne

mtaac(; i.vna)

bek ra;

cs '' /ta ae t: /rs

mtrtoee) i.ercd(;

bek ra;

cs '' /cmc ieaa? ae c: /oea trco

mtcmc(; i.oea)

bek ra;

cs '' /fmd ieaa? ae e: /i a trco

Sse.u.rnl(i.i() ytmotpitnmtfm);

bek ra;

cs '' /vlraul ae v: /ao ta

Sse.u.rnl(V"mtrtracna); ytmotpitn":+i.eon_ot()

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

9/15

6/5/12
bek ra;

POLIMORFISMO

cs '' /msr vtr ae m: /ota eo

fritj0jvtlnt;+) o(n =;<e.eghj+

{Sse.u.rn([+e[]"";} ytmotpit""vtj+])

Sse.u.rnl(; ytmotpitn)

bek ra;

dfut ; eal:

}/sic /wth

}wie(!''; hl o=q)

}/tybok /r lc

cth(xeto er){/ nofc nd * } ac Ecpin ro * a ao aa /

}/mi mto /an ehd

}/casPicpl /ls rnia

m []1[]3[]5 0[]2[]4[] a9 m []1[]3[]5 9[]2[]4[] fff a3 3 t a2 2 m

[]1[2[3[]5 9[]2]3]4[] c v V0 : q

Exerccios: 1Defina uma classe de nome ArrayServices que fornece servios para vetores. Implemente os "servios" de: ordenao de subvetor (vetor interno menor ou igual ao vetor em questo) , busca, troca de posies, etc. Esta classe opera sobre os vetores passados como argumentos de seus mtodos (passagem implcita do ponteiro para o vetor). Os vetores devem ser de tipos numricos definidos na linguagem (conte com a existncia de operadores + - < ==, etc). Voc ter que definir uma verso desta classe para cada tipo da linguagem (byte, float, etc). Na verdade isto no trabalhoso, basta voc definir para um tipo, depois
www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38 10/15

6/5/12

POLIMORFISMO

alterar s as partes necessrias e recompilar para os demais. Pense como fazer a classe ArrayServices trabalhar em conjunto com a classe Iterador vetor. No confunda estas duas classes, elas executam tarefas distintas.

3.3.2. ACOPLAMENTO DINMICO DE MENSAGENS


Por acoplamento entenda a escolha certa de um mtodo a ser executado para uma varivel declarada como de uma classe, mas podendo conter um objeto de uma subclasse desta. Por dinmico entenda em tempo de execuo. J dissemos que um objeto de uma classe filha garante no mnimo o comportamento "behaviour" de seu pai. Por este motivo podemos atribuir um objeto da classe filha a uma varivel da classe pai, mas no o contrrio. Acoplamento dinmico mostrar que possvel fazer com que o compilador execute a implementao desejada de um mtodo redefinido para classes herdeiras, mesmo no caso de chamada de mtodo ocorrer para uma varivel de superclasse (classe pai) contendo um objeto de uma subclasse (classe filha). Isto nos permitir construir listas heterogneas 3.3.3. Fazendo uma comparao com linguagens procedurais: O trabalho do dynamic binding normalmente feito desta forma em linguagens procedurais:
/CmuaotBnai /optCnaacra

i tp()=otCret te CmuaotCret() f yea=Cnaorne hn optCnaornea;

es i tp()=opnate Cmuaopnaa;/caaa le f yea=Puac hn optPuac() /hmds d poeiets e rcdmno

J e lnugn oinaa aojtscm Jv tmso m igaes retds beo oo aa eo sgit: eune

CnaCnVtnwcna3;/Vtrd ojtsd cas cna ot ote=e ot[] /eo e beo a lse ot

CnVt0=e Puac(00.0;/td Puac ua ote[]nw opna10,1) /oa opna m Cna ot

CnVt1=e Cnaorne10,1,) /td Cnaorne ote[]nw otCret(00.00; /oa otCret uaCna m ot

CnVt2=e Puac(00.5; ote[]nw opna13,1)

CnVtx.opt(;/noiprapr qecas d heaqi ote[]cmua) /a mot aa u lse a irrua d cna,cmua e ots opt

/cmuadfnd eocmiao aol dnmcmne e tmo /opt eiia opldr cpa iaiaet, m ep d eeua a e xcco

/mnae /esgm

Diagrama das classes:

A classe filha garante no mnimo o mesmo comportamento, "behaviour" da classe pai, podendo acrescentar ou redefinir parte do que foi herdado. Por este motivo, uma varivel da classe pai pode receber um objeto da classe filha, o comportamento da classe pai fica garantido e o restante (o que a classe filha acrescentou) perdido. J uma varivel da classe filha no pode receber um objeto da classe pai, porque os mtodos definidos para variveis desta classe passam a no fazer sentido para o objeto
www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38 11/15

6/5/12

POLIMORFISMO

contido nesta varivel. O diagrama reflete o aspecto das caractersticas acrescentadas pela classe filha a classe pai, mas no o fato de uma varivel da classe pai poder receber um elemento da classe filha, isto porque como no desenho o pai desenhado menor que o filho, o leitor tem a tendncia de inferir que o pai cabe no filho o que justamente o contrrio do que acontece em termos de variveis. 3.3.2.1. UM EXEMPLO ESCLARECEDOR O exemplo a seguir cria dois objetos (pai e filho) e faz atribuies e chamadas de mtodos entre eles.

/Cas Sprlse /lse ueCas

casSprlse{ ls ueCas

pbi vi nm( ulc od oe)

{ Sse.u.rnl(Mtd d sprlse) ytmotpitn"eoo a uecas"; } }

/Cas Sblse /lse uCas casSblseetnsSprlse{ ls uCas xed ueCas pbi itnvarbt; ulc n ootiuo pbi vi nm( /rdfnco ulc od oe) /eeiia { Sse.u.rnl(Mtd d sblse) ytmotpitn"eoo a ucas"; } pbi vi nvmtd( ulc od ooeoo) { Sse.u.rnl(Nv mtd:+ootiuo; ytmotpitn"oo eoo"nvarbt) } }

/Cas picpl AqioPicpljv /lse rnia, ruv rnia.aa casPicpl{ ls rnia pbi sai vi mi(tigag[){ ulc ttc od anSrn rs] Sblseeu1nwSblse) uCas sb=e uCas(; Sprlseeue1nwSprlse) /pdratraoaouaSblseau ueCas spr=e ueCas(; /oei e lcd m uCas qi eu1nm(; sb.oe)

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

12/15

6/5/12
eu1nvarbt=0 sb.ootiuo1; eue1nm(; spr.oe) eue1eu1 spr=sb; eue1nm(; spr.oe) }/mi mto /an ehd }/casPicpl /ls rnia

POLIMORFISMO

Mtd d sblseMtd d sprlseMtd d sblse eoo a ucas eoo a uecas eoo a ucas

/CMNAIS /OETRO:

Nt qeomtd ecliad aod cmocned oe u oo sohd e cro o oto d vre enod aod cmacas dsa a aivl e cro o lse et.

3.3.2.2. O QUE ACONTECE COM O QUE FOI ACRESCENTADO Depois do programa anterior, voc deve estar se perguntando o que acontece com o que foi acrescentado pela classe filha quando um objeto desta classe atribudo a classe pai.

//Insira aqui o arquivo da SuperClasse do exemplo anterior //Insira aqui o arquivo da SubClasse do exemplo anterior //Classe principal, Arquivo Principal.java class Principal { public static void main(String args[]) { SubClasse esub1=new SubClasse(); SuperClasse esuper1=new SuperClasse(); //poderia ter alocado uma SubClasse aqui esub1.nome(); esub1.novoatributo=10; esuper1.nome(); esuper1=esub1; esuper1.nome(); esub1=(SubClasse)esuper1; //cast esub1.nome(); esub1.novometodo(); } //main method } //class Principal

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

13/15

6/5/12

POLIMORFISMO

Mtd d sblse eoo a ucas Mtd d sprlse eoo a uecas Mtd d sblse eoo a ucas Mtd d sblse eoo a ucas Nv mtd:0 oo eoo1

//COMENTARIOS Embora voc seja capaz de recuperar os mtodos e atributos acrescentados atravs do type casting, enquanto isto no for feito, estes mtodos e atributos esto inacessveis. Exerccios: 1Implemente em suas classes mtodos que imprimem uma frase identificando o tipo da classe, por exemplo: "Eu sou a classe conta corrente, especializao de conta bancaria." 2Modele e implemente uma hierarquia de CONTAS BANCRIAS, use os recursos que achar conveniente: classes abstratas, interfaces, variveis static. Voc deve definir classes semelhantes as contas bancrias como poupana, conta corrente, etc. Os mtodos devem ter nomes como deposita, saca, computa, etc.

3.3.3. LISTA HETEROGNEA DE FORMAS (geomtricas)


Este exemplo lida com um vetor de objetos da classe forma definida em 3.3CLASSES ABSTRATAS E CONCRETAS , estes objetos so retngulos, pontos, etc. O objetivo mostrar: subclasses contidas em variveis (posies de vetor) da superclasse e acoplamento dinmico de mensagens. O nosso vetor de formas conter objetos grficos de classes heterogneas. Trataremos todos de maneira uniforme, chamando os mtodos mostra e move. Voc j viu nos exemplos anteriores como recuperar o objeto em uma varivel de sua prpria classe e no superclasse.

Rcmiecmes nv mtd mi: eopl o se oo oo an /Isr au adfncod cas Fradd e 33LSE ASRTSECNRTS /nia qi eiia a lse om aa m .CASS BTAA OCEA /Isr au adfncod cas Pnodd e 33LSE ASRTSECNRTS /nia qi eiia a lse ot aa m .CASS BTAA OCEA /Isr au adfncod cas Rtnuodd e 33LSE ASRTSECNRTS /nia qi eiia a lse eagl aa m .CASS BTAA OCEA /Cas picpl AqioPicpljv /lse rnia, ruv rnia.aa casPicpl{ ls rnia pbi sai vi mi(tigag[){ ulc ttc od anSrn rs] Fravtrrfc[=e Fra4; om eogaio]nw om[] vtrrfc[]nwRtnuo002,0; eogaio0=e eagl(,,01) vtrrfc[]nwPno01; eogaio1=e ot(,) vtrrfc[]nwRtnuo10102,0;/ldsiui eogaio2=e eagl(0,0,02) /ao gas vtrrfc[]nwPno21; eogaio3=e ot(,) friti0i4i+ o(n =;<;+) { vtrrfc[]msr(; eogaioi.ota) } fritj0j4j+ o(n =;<;+) { vtrrfc[]mv(20,20) eogaioj.oe1.f1.f; vtrrfc[]msr(; eogaioj.ota) } } }

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

14/15

6/5/12
(,)2,0 (,)(0,0)2,0 (,) 00(01) 01 1010(02) 21 (21)2,0 (21)(1,1)2,0 (41) 1,2(01) 1,3 1212(02) 1,3

POLIMORFISMO

//COMENTARIOS: Observe que a implementao correta do mtodo mostra escolhida em tempo de execuo de acordo com a classe do objeto que est naquela posio do vetor. Exerccios: 1 Considere as seguintes declaraes em Java:
pbi casT ulc ls { pbi vi fvi){Sse.u.rnl("so e T)} ulc od (od ytmotpitn Etu m "; } ; pbi casSetnsT ulc ls xed { pbi vi fvi){Sse.u.rnl(Etue S)} ulc od (od ytmotpitn"so m "; } ; Tx nwT) = e (; SynwS) =e (; TpnwT) =e (;

e as seguintes invocaes de operaes:


pf) /pier .(; /rmia py =; pf) /sgna .(; /eud xf) /trer .(; /ecia yf) /qat .(; /ura xy =; xf)/qit .( /una

Responda qual o resultado na tela de cada uma destas chamadas.

PRXIMO MDULO DO TUTORIAL: POLIMORFISMO

www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38

15/15

Potrebbero piacerti anche