Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
POLIMORFISMO
pbi Faa(n us)/sbeag d cntuo oiia ulc rcoit mo /orcra o osrtr rgnl
nmus; u=mo
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(;
www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38
1/15
6/5/12
POLIMORFISMO
nmt u=;
dnm e=;
casPicpl{ ls rnia
bnwFaa(,) =e rco26;
amsr(; .ota)
bmsr(; .ota)
casm() =.oab;
cmsr(; .ota)
camlilccob; =.utpiaa()
cmsr(; .ota)
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.rnl(.ovren() ytmotpitnacnetit);
Sse.u.rn((obea"; ytmotpit"dul) )
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
casPnoetnsFra{ ls ot xed om
www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38
4/15
6/5/12
/grneoetd d ojt /aat sao o beo
POLIMORFISMO
Sse.u.rnl((+hsx""ti.+)) ytmotpitn""ti.+,+hsy"";
xa;ya; =x =y
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
casPicpl{ ls rnia
a.ota) rmsr(;
a.oe11; rmv(,)
a.ota) rmsr(;
//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.
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
casPicpl{ ls rnia
ca o /ooco hr ; /=pa,
ty r{
d o
d {omuaanuSra.edie)caA() } o =eDtIpttemraLn(.hrt0;
wie(='n) hl o=\';
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()
bek ra;
emtrtra) =i.eon(;
Sse.u.rnl() ytmotpitne;
bek ra;
mtaac(; i.vna)
bek ra;
mtrtoee) i.ercd(;
bek ra;
mtcmc(; i.oea)
bek ra;
Sse.u.rnl(i.i() ytmotpitnmtfm);
bek ra;
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
{Sse.u.rn([+e[]"";} ytmotpit""vtj+])
Sse.u.rnl(; ytmotpitn)
bek ra;
dfut ; eal:
}/sic /wth
}wie(!''; hl o=q)
}/tybok /r lc
[]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.
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
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.
casSprlse{ ls 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.
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 (;
www.ic.unicamp.br/~cmrubira/aacesta/java/javatut11.html#RTFToC38
15/15