Beruflich Dokumente
Kultur Dokumente
o
da Pro
Traduo
Joo Eduardo Nbrcga Torlcllo
Revisl10 Tcnic(l
Ana Fernanda Gomes Ascencio
a
em 21
Tony Sintes
Bacharel em Ci ncia da Computao pela pue-sp
o
Especialista cm Si stema de Infonnao pela UFSCAR c mestre cm computao pela UFROS
I
r
PEARSON
Makron
Books
So Paulo
Brasil Argentina Colmbia Costa Rica Chile Espanha
Guatemala Mxico Peru Porto Ri co Venezuela
@ 2002 by Pearson Education do Brasil
Ttulo Original:
Object Oriented Programming in 21 Di as
2002 by Sams Publi shing
Todos os direitos reservados
Editora: Gislia do Carmo Cosia
Gerente de Produo: Si las Camargo
Produtora Editorial: Sandra Cristina Pedri
Reviso: Jorge Abdalla Neto
Capa: Marcelo da Silva Franozo, sobre o projeto original
Editorao Efetr6nica: ERJ Informtica LIda.
Dados de Catalogao na Publicao
Sintes, Tony
Aprenda Programao Orientada a Objetos em 21 Dias
Traduo: Joo Eduardo Nbrega TorteUo
Reviso Tcnica: Ana Fernanda Gomes Ascencio
So Paulo: Pearson Education do Brasi l, 2002
Titulo Original: Object Oriented
Programming in 21 Dias
ISBN: 85.346.1461-X
,
Indice para Catlogo Sistemtico
1. Programao Orientada a Objelos
2002
Direitos exclusivos para a lngua portuguesa cedidos
Pearson Education do Brasi l,
uma empresa do grupo Pearson Educalion
Av. Ermano Marchetti, 1435
CEP 05038-001 - Lapa - So Paulo - SP
Tel : (11) 3613- 1222 Fax: ( 11) 3611-0444
e-mail : vendas@pearsoned.com
Sobre o autor
TONY SINTES trabalha com tecnologias orientadas a objetos h sele anos. Nesse tempo, Tony
fez parte de muitos trabal hos de desenvolvimento orientados a objetos de larga escala. Alual-
mente, Tony trabalha na Firsl Class Consult ing, uma empresa que fundou para ajudar as grandes
empresas a integrar seus diversos s istemas em uma estrutura unificada. Antes de iniciar a First
Class Consulting, Tony trabalhou na BroadVision como consultor snior, onde ajudou a cons-
truir alguns dos maiores sites Web do mundo. Atualmente, as principai s responsabilidades de
Tony so como arquiteto, lder tcnico e mentor da equipe, ajudando a construir as habilidades
em desenvolvedores menos experientes.
Tony um autor tcnico ampl amente reconhecido, cujos trabalhos tm aparecido naJavaWorld,
Dr. Dobb 's JOllrnol, LinuxWorld, JavaOne Today e Silicon Prairie, onde co-autor de uma co-
luna mensal altamente respeitada sobre programao orientada a objetos. Atuahnente, Tony es-
creve a coluna mensal de perguntas e respostas daJavaWorld. Voe pode entrar em contato com
ele no endereo styoop@flrslclasscommlling.nel.
Agradecimentos
Escrever um livro um processo como nenhum outro. A quantidade de pessoas que colaboram
em um livro, e que so necessrias para produzir a cpia final que voc est lendo agora, sim-
plesmente espantoso. Gostaria de estender minha gratido equipe inteira de editoriais da Sams.
Sem seu trabalho rduo, este li vro simplesmente no existiria.
Pel o nome, gostaria de agradecer a Michael Stephens, Carol Ackerman, Tiffany Taylore George
Nedeff. A liderana e toques sutis de Carol foram o que realmente fi zeram este li vro prosseguir
at sua concluso. A capacidade de Tiffany de estruturar e encadear o material tcnico, clara e
conci samente, simplesmente espantosa. No apenas as edies de Tiffany tornaram este livro
mai s legvel, mas acho que seu trabalho me ensi nou algumas lies valiosas sobre redao tc-
ni ca. Tambm gostaria de agradecer a William Brown. Wi ll iam entrou em contato comigo a respeito
do projeto STY oor, no incio de agosto de 2000. Confiar tal projeto a um aut or relativamente
desconhecido era arriscado e agradeo a William por me dar a chance de escrever este li vro.
Agradeo especialmente aos edi tores tcnicos, Mark Cashman e Ri chard Baldwin, que garanti-
ram que o material apresentado fosse tecnicamente bom. Agradeo a vocs pela awao tcnica.
Aos meus colegas, muito obrigado. Gostaria de estender os agradecimentos especiai s a David
Kim e Michael Hall . Eu comecei este livro enquanto estava na BroadVis ion e gostaria de agrade-
cer a David Kim por me permit ir aquel as frias de pnico, quando os prazos de entrega comea-
ram a se aproximar. Tambm gostaria de agradecer a Michael Han, por SlIas idias tcnicas e por
escrever o apndice sobre Java deste livro.
Por (ll timo, mas no menos importante, tenho o privilgio de agradecer minha maravilhosa es-
posa, Amy, por seu apoio firme, revi sl'lo e pacincia. Agradeo ainda minha ramlia e amigos,
que ofereceram seu apoio e que ouviram minhas reclamaes.
Diga-nos o que voc acha!
Como leitor deste livro, voc nosso crt ico e colaborador mais importante. Valori zamos sua
opini o e queremos saber o que estamos fazendo corretamente. o que poderamos fazer melhor,
sobre quais reas voc gostaria de nos ver publi cando e qualquer outra sugesto importante que
deseje passar para ns.
Receberemos com satisfao seus comentrios. Voc pode enviar um fax, e-mail ou escrever di-
feiamen te, para que possamos saber o que gostou ou no neste l i vro - assim como o que pode-
mos fazer para tornar nossos li vros melhores.
Por favor, entenda que no podemos ajud-l o em problemas tcnicos relacionados ao assunto
deste livro e que, devido ao grande volume de correspondncia que recebemos, no possamos
responder a todas as mensagens.
Quando voc escrever, cert ifique-se de incluir o tlul o e o autor deste livro, assi m como seu
nome e n(nnero de tele fone ou fax. Examinaremos seus comentrios cuidadosamente e os com-
partilharemos com os aulores e editores que trabalharam no livro.
Fax: (1 1) 36 11 -9686
Fone: ( 11 ) 3613- 12 13
Endereo elelrnico: clientes@makron.com.br
Endereo postal: Pearson Education do Brasi l Lida
Rua Emlio Goeldi, 747 - Lapa
So Paulo - SP - CEPo 05065-110
Sumrio
Introduo XXIII
Sobre os exemplos' .. ............ ......... .. . . ... . .. . XXI V
O que voc precisa saber para usar este livro' ... ... .... .. . .. . ..... XXIV
SEMANA 1 Definindo 00
,
Di a 1 Introduo programao orientada a objetos
3
Programai'lo orientada a objelos em um contexto histrico' . .. ..... . ....... 4
Precursores da POO .................................. ... .... ... 4
Programao orientada a objetos' . .... .................. .. . ..... . . 6
Uma estratgia de POO para software usando objetos ...... . ..... . ...... 6
O que uma classe?' ............................. ... . .. . .... .. 8
Reunindo tudo: classes e objetos' ............................... 9
Fa7..endo os objetos trabal har ' ............................. . ..... . I I
Relacionamentos de objeto ................................ . .... 13
Como a programao orientada a objetos fundamenta o passado ' ......... 14
Vantagens e objeti vos da 00 .................... ................ . . 14
Natural' ........................... . ........................ 15
Confi vel ' .................. ..... . .. . . .. .......... .. ..... 15
Reuti lizvel ' .... . ...... . ................................. 15
Manutenvel ' ......... .. . ... . ................ . ... .. . . ...... 16
Extensvel ........ . . . .. .... . . .. ... . . . .. . .. . . .. .. .. .... 16
Oportuno' ........ . . . ... . . . .. .. ..... ............... ...... . .. 16
Armadilhas ................................................... 16
Armad ilha I : pensar na POO simplesmente como uma li nguagem ... .. . . .. 17
Armadilha 2: medo da reut ili zao' . . . .. .. ........................ 17
Armadilha 3: pensar na 00 como uma soluo para tudo ' . . . . ........... 17
Armadilha 4: programao egosta' . . . . ................. . . . . . . .... 18
A prxima semana' ... . . ... . . . ... . ................... .. . ..... 18
Resumo ' . .. ....................... . . ......... .. . ..... . ..... 18
Perguntas e respostas' ...... . . . ......... . .... ................ 19
Workshop ............... ..... .......... . ..... .......... 19
Teste' ................ ' ..... .................. .. ... .. ..... 19
Exerccios ................. .... .. . .. . ................. . ..... 20
Dia 2 Encapsulamento: aprenda a manter os detalhes consigo mesmo 21
Encapsulamento: o primeiro pilar ' ................................ 22
Um exemplo de interface e implementao' ................. . . .. . . .. 24
x Aprenda Programao Orientada a Obj etos em 21 Dias
Pbli co, privado e protegido' ................................... 25
Por que voce deve encapsul ar? ....... ................... .. ..... . 25
Abstrao: aprendendo a pensar e programar de forma abstraia ' .... . ........ 26
O que abstrao? ............................................ 26
Dois exemplos de abstrao .................. ................... 27
Abslrao eficaz' ............................................. 28
Guardando seus segredos atravs da ocuhao da implementao' ........ . .. 29
Protegendo seu objeto atravs do TAO (Abslract Data Type - Tipo
Abstraio de Dados)- ...................................... . .... 30
O que um tipo? . .. . . .. .. . . . .. . . . ......................... . .. 30
Um exemplo de TAO . ........................ 33
Protegendo outros de seus segredos, atravs da ocultao da impl ementao' . 34
Um exemplo real de ocultao da implementao ................ . . . . . 36
Diviso da responsabil idade: preocupando-se com seu prpri o negcio' ....... 37
Dicas e armadilhas do encapsul amento' ........................ . . .. . . 41
Dicas e armadilhas da abstrao .. . . . . .. .. .................. . . . .. . 41
Dicas e armadi lhas do TAD .... ............. 43
Dicas da ocultao da implementao' . ........................... . 43
Como o encapsulamento atende os objet ivos da programao orientada
a objetos ................................................... 44
Advertncias ............ . ..................................... 45
ReSUI110 ........ .... . 45
Perguntas e respostas ..... . . ................................ 45
Workshop .............. . ................................. 46
Teste .. .................................... . ............ 46
Exerccios .............. . .... .. .............. .. . . . . . ..... 47
Di a 3 Encapsulamento: hora de escrever algum cdigo 49
Laboratri o I : configurando o ambiente Java' . . ................ . ...... 49
Exposio do problema' ....................... ... . ..... .. ..... 50
Laboratrio 2; classes bsicas' .... .. . . . ...... .. . . .. . . .. . ... .... .. 50
Expos io do problema' ...... . .... .. . . . .. . , .. " . .. . .... .. ..... 53
Solues e discusso' ............. .. . ............ .. .. . ....... 54
Laboratrio 3: o encapsulamento ' .. .... . .. . ................. .... . . 56
Exposio do problema ' ........................................ 57
Sol ues e discusso' ................................... .. ..... 57
Laboratrio 4: estudo de caso - os pacotes de pri mitivas Java (opcional ) ..... 62
Exposio do problema ' ........................................ 66
Sol ues e discusso .......................................... 66
Perguntas e respostas ............. . ........... . ..... .......... 67
Workshop ... . . . ......... . .................... , ... . .... 68
Teste' ................ ............ .... ..... ......... 68
Exercidos ............ . ..... . .... . .. .... .. .... .. .... ..... 69
Sumrio
Dia 4 Herana: obtendo algo para nada
7'
o que herana? . . ....... . .. . ...................... . .. . . ...... 71
Por que herana? . . . .. . ............ . .. ... . ........... . . .. ... . .. 74
" um" versus "tem um": aprendendo quando usar herana ' ...... ....... 75
Aprendendo a navegar na teia emaranhada da herana ' .. . . . .. .... .. . .... 77
Mecnica da herana ... . . ......... . . . . ............ ... . .. . .. 79
Mtodos e atributos sobrepostos' ... .. .. . .......... . ..... . . .. . . . .. 8 1
Novos mtodos e atributos . . ........... ... ..... .. . ... . . .. .. . 84
Mtodos e atributos recursivos .... .. .. . . ... .. ........ . . . . ..... 84
Tipos de herana .. . .. . ... .... . . . . ..... . ... ...... .. . . ... . . . . .. 84
Herana para impl ementao' .. ... .. . . .. ... ... . .... . . . . . . . . .... 85
Problemas da herana da implementao' .. . . . . .... .. . . . . . . . .. . .... 85
Herana para diferena' . .. .... .. . ...... . ... . . ... . ... . ........ 86
Especializao' ...... . .. .... .. . . . .. .. .... . . .. . . . .... ... . .... 87
Herana para substituio de tipo ....... .. . . ..... . . . .. ........ 90
Dicas para a herana eficaz ' .. .... .. . . . .... . . .. ... . . .... .... . .. . 92
Resurno ..... . .. . ... . . ...... . . ... . . ... .... . . . ... . ..... .. ... .. 94
Como a herana atende aos objetivos da 00 .. ... . .. . . .... ... . . ... . . .. . 94
Perguntas e respostas .. ....... . ....... . . .. . . . . . .... . . . . .. . .. . 96
Workshop . ............... . . . ............. . ..... . ..... . ...... 96
Teste' ......... . . . . ............ . . ..... ..... ..... .... .. 97
E
" ' xerclcl0s .......... . ..... . ................ . . . ...... ...... 97
Dia 5 Herana: hora de escrever algum cdigo 99
Laboratrio I: herana simples ' . . ......... .... .. ..... . ..... . ... . .. 99
Expos io do problema ' ......... ..... . ............... .. .. .. . . 100
Solues e di scusso' ... . .. . .. . ...... . .... . .. .. . . . .... . ....... 101
Laboratrio 2: usando classes abstratas para herana planejada . ... . . .. . . .. . 102
Exposio do problema' . . .. . ..... . . .... .. .. .. . ...... .. . .. . .... 105
Solues e di scusso' ......................... . . ..... . . .. . . . . . 105
Laboratrio 3: conta em banco - praticando a herana simples' . .. . ....... 107
Urna conta genrica . ...... . . . .. .. ..... . ........ . . . .... . .. . .. 107
A cont a poupana' ... . . . ........... . . .. . .. . .. .. . . .... .. . .... 107
Urna conta com vencimento programado' . .. .. .. .. .. . .. . . . . .... . . 107
Conta com cheques' . . . . . . . .. . ..... .. .. .. . . . ..... . .... . . .. ... 107
Conta com cheque especial ' . . . . . . . ........ . . . . . ... . . . . . . .. .... 108
Exposio do problema' . .. . ..... . . .. .... . . . . . .. . . . . ... .. 108
Expos io estendida do problema' ...... . ..... . . . .. . ............. 110
Sol ues e discusso' .... . . . ..... . ................. . .... . ..... I I I
Laboratrio 4: estudo de caso - " um", "tem um" e j ava.uti l.Stack .... .... 1 17
Expos io do problema .. . ... . .. . ................. . ........... I 18
Solues e discusso' . ... . .. . ........ . ... ............. . . . . . . . . I 18
ResUlllo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 19
Pergurllas e respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I 19
XII Aprenda Programao Ori entada a Obj etos em 21 Dias
Workshop' ...... . .. . . . .. . . .. . . . . . .. ....
Teste' ....... ..................... . . . .. . .. . . ........
E
.'
xerCIClOS ..................... . ........................
Dia 6 Polimorfismo: aprendendo a prever o futuro
120
120
120
121
Polinl orfi smo ....................... ....... . .. .. . . .. .. . ..... 122
Polimorfismo de incl uso' ....... . .......... o 126
Polimorfi smo paramtrico' .. . . .. . . ..... . .............. . ........ 13 1
Mtodos paramtricos' .................................... 131
Tipos paramtri cos ' . .. . . .. . ....... ............... .. .. . . . . 133
Sobreposio ............... .... ... . . . .... .... . .. .... 134
Sobrecarga' . . .. . . . .. .... .. . . .... . ... .. . . .. .... . . .. . . .. . . 135
Converso' .. . . . .. .... .... . .. .. .. ... .. .. .. . . . . . . ... . . . . 137
Poli morfis mo eficaz' . .. ..................... . .. . ............ . . . 137
Armadi lhas polimrficas ' . . .. .. . . . . . ........................ .. . . . 139
Armadilha I : mover comportamentos para cima na hi erarquia' ...... .. . . . 140
Armadil ha 2: sobrecarga de desempenho ' ..................... . .... 140
Armadil ha 3: vendas 141
Advertncias' ........ . . . .. .... .. . . . .. . .. . .. . .. .. .. . . .. . .. .... 142
Como o polimorfismo atende os objcti vos
da 00 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ResunlO ..................................................
Perguntas e respostas .... . . .. . ..............................
Workshop' ............ . ..... . ..................... . . . . ....
Teste' .... ......... . .. .... .. .............. . . .... .. . . . ....
E
. '
xerCICIOS ............ . . . .. . ............ . . . . ..... . ......
142
143
144
145
145
145
Dia 7 Polimorfis mo: hora de escrever algum cdigo 147
Laboratri o \: apli cando poli morfismo' .. .... . ... . . .. . . .. . . .. . . . . . 147
Exposio do problema ............... . .... .. .. . .............. 154
Solues e discusso' .. . . .. . . . .... ................... ... .. . . . . 155
Laboratrio 2: conta de banco - aplicando polimorfismo em um exemplo
conhecido' . . .................................... . .. . . .. ...... 156
Expos io do problema' . .. .. . . .. .. ................. ...... .. . . . 157
Solues e discusso' ....... . ................................. 159
Laboratrio 3: conta de banco - usando polimorfismo para escrever cdigo
prova do fut uro' .... . . . .. .. .... . .... .. ....................... 160
Exposio do problema ' ....................................... 162
Sol ues e discusso" ........................................ 163
Laboratrio 4: estudo de caso - estruturas condicionais Java e pol imorfismo' 165
Corri gindo uma estrutura condicional ............................. 167
Exposio do problema ' .. . .................................... 169
Solues e discusso' .... . .... . ..... .. .. ... . .. . .. ... .. .. ... 17 1
Res Ulll o ..... ............... . . . .. .. . . . . . .. . .. . . ..... ...... 172
Sumrio
XIII I
Perguntas e respostas .... . . . . . .. .. . .. ... . . . .... .. .... ... ... 173
Workshop' ...... ....... . .. . . .. . .... . . .. . .. . . ........ 173
Teste 173
Exerccios ........ .... .. . ............................. 173
SEMANA 1 Em reviso 174
SEMANA 2 Aprendendo a aplicar 00 175
Dia 8 Introduo UML 177
Introduo Unified Modeling Language ...... .. .. .... ..... . ........ 177
Modelando suas classes .. . . .. . . . .. . ........................ . . 179
Notao bs ica de classe' .............. . .. . . .. ........ ........ 179
Notao avanada de classe . . . . .. . ........................ .. . . . 181
Modelando suas classes de acordo com seus objeti vos .... . . . .. ... . . 18 1
Modelando um re lacionamento de classe' ......... . ..... .. .. .. , .. . ... 183
Dependncia' . ... .. . . . .. .. . . .. .. .................. .. ..... . . 183
Associao' ....... .......... . . .. . . .. .. . .............. . . 184
Agregao ' .................. ... ...... .... .. .. ....... 186
Conl pos iO ........ . .... . .................. .. ....... 187
General izao' ............ . . .. .. ............. . .. . .. . .... 188
Reun indo tudo ......... . .... ... .. .. . ... . . . .. ... .. .. . . .... 189
ResUlll o ............. ..... . .... .. . . .. ... .... . . . .. . . . . . .... 190
Perguntas e respostas ..... .. . . . . .... . . . . . . ..... . ..... . ....... 191
Workshop' ............ .. ... . ...........................
Teste ' ................. . .. . ..... . .......................
E
,.
xerCICIOS ...... . ....... . ......................... .. .. . ...
191
191
192
Dia 9 Introduo AOO (Anlise Orientada a Objetosl 193
O processo de desenvolvimento de software " ..................... . . . . 194
O processo it erativo ' .... .. . .... .. . . ...... ............ ..... . . 195
Uma metodologia de alto nvel ' ......................... . . . . .... 197
AOO (Anli se Orientada a Objetos)- .. .. . .. ................ . . . .... . . 198
Usando casos de estudo para descobrir o li SO do sistema ' . .... . . . . ...... 199
Cri e uma lista preliminar de casos de uso ................ . . .. ...... 20 I
Construindo o modelo de domnio' . . .................. .... ...... 2 13
E agora?' .. ... ...... ................. ........ .... .......... 2 14
Resull'o ............ . . . ................................... 2 15
Perguntas e respostas ......... ... . . ............. . ... .. ..... 2 16
Workshop' ............. . . . . .. . .... ..... . .... .. . . . .. ...... 2 16
Teste 2 16
Exerccios ............ .. ................................. 2 17
Dia 10 Introduo ao POO (Projeto Orientado a Objetos) 219
POO (Projeto Orient ado a Objelos)' ............... . .. .. . . . .. ..... 220
XIV Aprenda Programao Orientada a Obj etos em 21 Dias
Como voc apl ica roo (Projeto Orientado a Objeto)?' . . .. .. . . .. .. ...... 221
Passo I: gere uma lista inicial de objetos ............ .. . . ......... 222
Passo 2: refi ne as responsabilidades de seus objetos ......... ......... 223
Passo 3: desenvolva os pontos de imerao ....................... 231
Passo 4: detal he os relacionamentos entre os objelos ........ . ...... . .. 232
Passo 5: construa seu modelo .. . .................... .. . . ..... 233
ReSUlll O .......... . ............................. . . . . ... 234
Perguntas e respostas ... . .... . ... . . . .. .. .. .. . ... . .... . . ..... 234
Workshop' .. .. . . ..... . . .. . . . . .. . . . . ... . . . . .. ..... ......... 235
Teste' ........... .. . . .. . .... . ....................... . . . . 235
Exerccios ...................... . .. . ..................... 236
Dia 11 Reutilizando projetas atravs de padres de projeto 237
Reutili zao de projeto' ....................... .. .. ........... . . . 238
Padres de proj eto . . .. . . . .. ..... . . ...................... .. . . . 238
O nome do padro' . ... .. .. . .. . .. . . .. .. . ..... . ..... ... .. . . . 239
O problelna ........... ... . ...... ..... . .... .... ... .. ....... 239
A soluo' ... .... . . . . .. . . . . ....... . . . .. .. . . .. . ... ....... 239
As conseqUncias' .. . . . . . . . . ... . . . .. . ... .. . .. . . .. . . .. . .. .... 239
Realidades do padro' ...... . . .. . ... . . . . . . ... ... .. .. . . .. ....... 240
Padres por exemplo' .......... .. .. .. ... .. .... .. .... . ....... 240
O padro Adapter' .... . ..... . .............. . .... . ....... 24 1
O padro Proxy ........ . ........................ . .... . .. 245
O padro Iterator ........... . .... .. .. . . .. ....... . ... ..... 247
Apossando-se de um padro ' .... . . .... . ..... . .. . .. . . . .. . . . .... 254
ReSUlno ....... . .. . .. . .. . . . . . .. . . .. .. . . . .. . . . ..... . ...... 255
Pergunt as e respostas ........... . .... .. ..... .. .... . .... . ...... 255
Workshop' ..... . ..... ... .............................. . . . . 256
Teste' ................ .. . . . . ...... ..................... 256
E
" xerclclos ................. . . . ... ... ... .. ..... . .. . . . . ...... 256
Respostas do teste ' . . .. .... .. . . . .. . . . . . .... . ..... . . . . . . .. . . . . 259
Respostas dos exerccios ' ..... . . . ... ... ... ... ... .. .. . . . . . . ...... 260
Dia 12 Padres avanados de projeto 263
Mais padres por exemplo' .. . .. . ............ . .. . . .. ..... .. ..... 263
O padro Abst racl Factol)' 264
O padro Singleton ' . . . . .. . .. . ... ... .... . .. . . . . . . . .. . ..... 269
O padro Typesafe Enum ..... .. . ..... .. . .. . ..... . . . ... .. .... 275
Armadilhas do padro' ..................................... 280
Resumo' ................ ........ ...... . ............... 281
Perguntas e respostas ..... ................ . ..... . .... .. ..... 28 1
Workshop' .............. . ................. . . . .. . . .. ..... 282
Teste ' ............. .. . . . . . . ... ... . . . ... . .. . .. ... .. .. .... 282
Exercfcios ..... . . . . . . ... . . . . . . .. . . . . . .. . .. . . ..... . . .. .. 282
Sumrio
Respostas do teste' .......... , , ........... . . . . . .... .... .. ...... 284
Respostas dos exerccios' ..................... .. .. .. . . ......... 285
Dia 13 00 e programao da interface com o usurio
289
POO e a interface com o usurio' ........................... .. ..... 289
A importncia das Uls desacopladas .......................... . ..... 290
Como desacoplar a UI usando o padro Model View Controll er ... ......... 293
o Inodelo' ............ ........ ... . ......................... 294
o modo de visualizao' ...................................... 297
O controlador ' .... . .. . . .. . .............................. 30 I
Problemas com o MVC ....... . ............ . ..... 303
Uma nfase nos dados' . . .. . . . .... . ... .. . . .. .. . . ... . . . . . . 304
Acoplamento fort e' . .... .... . .. .. . . . . .. . . .. . . ... . .. . . . . 304
Ineficincia' ............. .. .. .. .. .... . ... .. .. ........... ... 305
Resumo ' ...... . . . .. . . . ... .... ......................... . . . . 305
Perguntas e respostas .. ... .. .. . .. . .. . . .. .. . ................... 305
Workshop' .............. ......... ........... . ......... ... .. 306
Teste' ....... ... . .. . .. . .. . ..... . ...... . .... .. . ... ....... 307
Exerccios ................................ .. .... . . .. . .. .... 307
Dia 14 Construindo software confivel atravs de testes 313
Testando software 00314
Testes e o processo de desenvolvi mento de software iterat ivo' .... .. . . .... 3 14
Fonnas de teste' ...................................... . . . . .... 3 17
Teste de unidade ................................ .... . ...... 317
Teste de integrao' .............. .. .... .. ......... . ....... 3 18
Teste de sistema ' . . .... .. .......................... .. .. .... 318
Teste de regresso ... .................. ................... 3 19
Um guia para escrever cdigo confivel ' ..... . .. ... .... . .... . . .... 3 19
Combinando desenvolvimento e teste' .... .... . .. . . . ... .. . . . . . 3 19
Escrevendo cdigo excepcional ' .. . .. . . .. .. .. . . . .. . . . . .. ..... 335
Escrevendo documentao eficaz' ............ .. ................. 336
Resumo ' ........ . .. . . .. .... . ............................ . . 339
Perguntas e respostas .......... . .. . .......................... 339
Workshop' ....................... . ........................ 340
Teste 341
Exerccios .... ...... . ... . .. ... .. .... . . . . .. ... .... .. ..... 341
SEMANA 2 Em reviso
342
SEMANA 3 Reunindo tudo: um projeto 00 completo 345
Dia 15 Aprendendo a combinar teoria e processo 347
Jogo Vinle-e-um' .................... . ...... . .... . ... . ... .... 347
Por qu vi nte-c-um? ................... - .... . . .. . . ... ...... 348
XVI Aprenda Programao Ori entada a Obj etos em 21 Dias
Ded arao da viso' ............ .. .. . . ... . . . .... . . .. .. ...... 348
Requis itos de sobreposio ' ....... . .... . . .. .. .. . . ......... 349
Anlise inicial do jogo vinte-e-um ..................... .. ......... 349
As regras do jogo vinte-e-um ............ ..................... 350
Criando uma lista preliminar de casos de uso' .......... .. .......... 353
Plancjando as iteraes ' ......... . ................ . .. ..... ..... 353
Iterao I : jogo bsico' .................... ... .. . . .... . . .. .. 354
Iterao 2: regras' ... ................ . . .. . ... . .. .. . . ... .. 355
Iterao 3: aposta' ................. . .. . . . .. . ..... .... . . ... 355
Iterao 4: interrace com o usurio ' . ..................... . . . . 355
Iterao 1: jogo bs ico ......................................... 356
Anlise do jogo vinte-e-um' . . . . ......................... . . . . 356
Projeto do jogo vinte-e-um .. . . . .... . .. . .. . ... . ... . ... . . 360
A implementao' ............ . .. . .. . . .. .. .. . .. . .. ... ..... 365
Resumo ' ........... . . .. . .. . . .... . .. . .. . . .. . . . .. ...... . . 380
Perguntas e respostas .. . . . . .. . . .. . .............. . ....... ..... 381
Workshop' ................. - ............................. 381
Teste' ............. . .. . . - - ..... - ..... . ........... .... .... 381
Exerccios ................................... . ........ . .... 381
Dia 16 Iterao 2 do jogo vinte-e-um: adicionando regras 383
Regras do jogo vinte-e-um ..................................... 383
Anlise das regras' ...... ..... ........................ . - ...... 384
Projeto das regras' .......... . .................... ... ..... 388
Implementao das regras' .... . . ... -o . 395
Teste' ......... . .. .......... .. . .... .. .. ... ..... . ...... 409
ResUlno .......................... .. ................ . ...... 409
Perguntas e respostas ... .... ... ...... .................... . ... 410
Workshop' ............... . .......... ..................... 4 10
Teste 4 11
Exerccios ... . . . .. .. .... . . . .. .. ............ . . .. . . ... ....... 4 1 I
Dia 17 Iterao3dojogo vinte-e-um: adicionando aposta 413
Aposta no jogo vinte-c-um . .. .. . . .. .. . . . .. .. . ............ ....... 413
Anlise da aposta' ...... ........ ................ . ........... 4 14
Projeto da aposta .................. . ....... . . . ... . . . ...... 4 17
Impl ementao da aposta .. . ..... . ...... . . .. . .. . . . . .. . ..... 420
A implementao de Bank (Banco) ......... . .. ... ... ........... 421
Um pequeno teste: um objeto falsificado' ....................... 427
Resumo ' ..................... .... ....................... 428
Perguntas e respostas .......................................... 429
Workshop' .............. ..... ............. . . ... ... ...... 429
Teste' ..... ........ .. . . . . . . ... . . . ... . . . . .. . .. .. . .. ...... 429
Exercicios .... . . . . . . . ... ... . .. .. . . . . . .... . . . .. .. . ...... 429
Sumrio
XVII I
Dia 18 Iterao 4 do jogo vinte-e-um: adicionando uma GUI 431
Apresentao do jogo vinte-e- um' ....................... . ........ 431
Oti mizacs da linha de comando ...... ..... . ........... ......... 432
Anlise da GUI do jogo vi nte-e-um ' .................... o 433
Casos de uso da GUI .... ...... ........ . . . .. . . . . .. ... . .. . . 433
Modelos visuais de GUI .. ...... ..... .. .. .. .. . .. .. .. ..... 436
Projeto da GUI do jogo vinte-e-um 437
Cartes CRC da GUI ...................................... 437
Estnltura da GUI 438
Refazendo' .. . .................................. .... . . . . . 439
Diagrama de classes da GUI . . .... . ... ....... . ... . .. o 440
Implementao da GUI do jogo vinte-e-um . . ..... ... ... . . . . ..... 440
Implement ando YCard, YDeck c CardVicw .. ......... . .. . . . ... . . . . 440
Implementando Pl ayerVicw' .. . . .. . ..... . ...................... 444
Implementando Opt ionYicw e OptionViewCont roll er' ....... .. ... .. . . 445
Implementando GUIPlayer . .. . . .. . .. . ................. . ....... 445
Reunindo ludo com BlackjackGUI 448
Resurl10 ...... ..... . .. . .. . ......... .. . . . . .. . . . .. .... ... .. 449
Perguntas e respostas .... ........ . .... . . .. . . .. . .. . . . . ..... 450
Workshop' ............ . . . ... . . .. ......... .. . ............. 450
Teste' .......... .. ........................... . ....... 450
E
. .
' XCrcICIOS .............. .......... ...... . ............. 451
Dia 19 Aplica ndo uma alternativa ao MVC
453
Uma GUI alternativa do jogo vinte-e-um 453
As camadas do PAC .... ... ....................... .. .. .. .. 454
A filosofia do PAC , .... ... . .. . ............................. 454
Quando usar o padro de projeto PAC ............................ 455
Analisando a GUI PAC do jogo vinte-c-um .... ................ .... . . . 455
Projetando a GUI PAC do jogo vinte-e-um ................. . . . ...... 455
Identificando os componentes da camada de apresentao' .... . . . . .. . . . . 456
Projetando os componentes da camada de abslrao' ................. 457
Projetando ri camada de controle' ............................... 458
Usando o padro Faclory para evi tar erros comuns' ..... ..... . .... . . 458
Implementando a GUI PAC do jogo vinte-e-um' .... . ..... . .......... 460
Implementando YCard e VHand ................. . .. ... ... . .... 460
Implementando VBettingPlayer ................ . . . .. . ..... 462
Implementando VBlackj ackDealer' ...... . ..................... 464
Implementando GUIPlayer ................... .... ......... 465
Reunindo tudo com O Controle' .................. ..... . .... 465
Resurl10 ...................................... .. ..... . ..... 468
Perguntas e respostas .. .... ...... ..... ..... . . . . . .. . . .. . .. . .. 468
Workshop' ............ . .... . . . .... .. ... ... ... . .. ... .. . ..... 468
XVII I Aprenda Programao Ori entada a Objetos em 21 Dias
Teste ' ....... , , .. , . , ... , , , ... .. .. . .... . . . .... .. .. .. . ..... 468
Exercicios .......... ........... .... . . .. .. .. . . ......... 469
Dia 20 Oivertindo-se com o jogo vinte-e-um 471
Di vertindo-se com O polimorfismo" ............. .... . .... ....... 471
Criando um jogador ................ . .. . ... . .. .. . .. .. . ..... 471
O jogador seguro' .............. .. . .. .. .... .. . ........... 472
Adicionando SafePlayer na GUI ...................... . ........ 472
Aperfeioamento' ........................................ 473
POO e simul aes' .. . . ............... ................... . . .. 474
Os jogadores do jogo vinte-c-um ' .... .. .. . . . ............ . ..... 474
Resurno .... .... . ............ .... . ... .. . . .. ... . . . .. . . .... 479
Perguntas e respostas .. .... .. . . . ....... . .. .. .. . . . . .... . . . . 480
Workshop' ......... .... . .. .. .... . ..... . ..................... 480
Teste' ...... . . . .. . . . ... . . . .......... ............... ..... 480
Exerccios ..... ......... . . .. . .......................... 480
Dia 21 O ltimo quilmetro 483
Amarrando as pontas ....... . ..... . ............................. 483
Refazendo o projeto do jogo vinte-eum para reut ili zao em outros
sistcnl as ............ .............. ......................... 484
Identificando as vantagens que a Poo tTouxe para o sistema do jogo
vi nteeum ................................................. 489
Rea li dades do setor e POO ..................................... 491
Resulllo .................... . . .. .. . ..... .... . ...... . ...... 49 1
Perguntas e respostas . ..... ...... ......................... . 491
Workshop' ............ . .................................. 492
Teste' ...... . .. .. . ... .. .. ...................... .. . .... 492
Exerccios .... . .. .... .. . ............ . . .. .. .. .... ....... 492
SEMANA 3 Em reviso 493
Apndices
495
Apndice A Respostas 497
Dia 1 Respostas do teste ' . . ................. .. .. . . ...... .... .. . . 497
Respostas do teste' ............. . .......................... 497
Dia 2 Respostas do teste e dos exerccios' ......................... 499
Respostas do teste' ......................................... 499
Respostas dos exerccios' .......................... . ... ..... 50 I
Dia 3 Respostas do teste e dos exerccios' ...... .. . ... . . ... .. ....... 50 1
Respostas do teste' .. .... ....... ........ ... . . .... ............ 50 I
Respostas dos exercicios' .................................... 503
Dia 4 Respostas do teste e dos exerccios' ....................... . .. 505
Respostas do teste' ...... . .... . ............................. 505
Sumrio
Respostas dos exercicios' .... . .. . ... . .. .. . . . ..... . .......... 507
Dia 5 Respostas do teste' . . .............. . . .. .. .. . . ......... 508
Respostas do teste' ............... . ..... . ................... 508
Dia 6 Respostas do teste e dos exerccios' ......................... 508
Respostas do teste' ...... .. ......... . ... . .................... 508
Respostas dos exercicios' ...... . ................... .. .. . ..... 5 10
Dia 7 Respostas do teste' .............. .. . .. ... . . . .. . .. . . . ... 511
Respostas do leste' ... . .... . .. . ..... . .. . .. . ... . .. .. . .. ..... 51 1
Dia 8 Respostas do teste e dos cxerccios' .... . .... . . . .. ..... ... .. . ... 512
Respostas do teste' .. .. . . .. . .... . ...................... . . . . 512
Respostas dos exerccios' ........... . .. . . . ................... 5 13
Dia 9 Respostas do teste e dos exerccios' ..... . ... .. .. ... . .. .. . . . . 515
Respostas do teste' .. .... .. . . . ......... .. . ... .. . . . . . . . . 5 15
Respostas dos exerccios' .............. . .. . . . .. . . .. .. ... .. . . . 5 17
Dia 10 Respostas do teste e dos exerccios' .... .. . .. . ... . . .... . . 5 17
Respostas do teste' .. . . . .. .. .... . .......... .... . . ...... ...... 5 17
Respostas dos exerccios' . ......... ........... ... ........... 5 19
Dia I I Respostas do teste e dos exerccios ' .. . ............ .. .. . .... 520
Respostas do teste' ............................ .. .... . ... . .... 520
Respostas dos exerccios' ............... . . .. . . . .. . . . . . . . . ..... 521
Dia 12 Respostas do teste e dos exerccios .... .. . . . . ... . .. .. . . . ..... 523
Respostas do testc' .................... . . .. ..... . ..... . ....... 523
Respostas dos exerccios' . . .. . ............................. 524
Dia 13 Respostas do teste e dos exerccios . . ..................... 528
Respostas do teste' . ....... ...... ......... . ..... .. ... . . ...... 528
Respostas dos exerccios' ... . .. . .. . .. . ....... . .. .. . .. . . ..... 529
Dia 14 Respostas do teste e dos exerccios' .... . . . ... . . . . .. . . ...... 53 1
Respostas do teste' . . .. .... .. .......... ... .. .. . . ..... . .. . . .. 53 1
Respostas dos exerccios' . .. . .... .. . . .. . ... . .. .... . ......... .. 532
Dia 15 Respostas do teste e dos exerccios' . .. . .. . .. ................ 533
Respostas do teste' .. .. ... .. . . ....... ............... ......... 533
Respostas dos exerccios' ... . . . ...... . .. .. .. ..... . ... . . . ...... 533
Dia 16 Respostas do leste e dos exerccios' .... . . . . . . . . . ... . . . .... ... 534
Respostas do teste' .. . . . .. .. . .. . .. ..... . .. . . . . . . . . .. . . .... . . . 534
Respostas dos exerccios' . .... .............. . .. . . .. ........... 534
Dia 17 Respostas do teste e dos exerccos ' .. . .............. ....... 536
Respostas do teste' .... . ........ . .... . .................... 536
Respostas dos exerccios' ................... . ..... . .... .. ..... 536
Dia 18 Respostas do teste e dos exerccios ' ....... . . . .... .... . .... 540
Respostas do teste' ...... . .......... . .... . . . . ... .... , .... 540
Respostas dos exerccios' .................. . .... .. ..... . ..... 540
Dia 19 Respostas do teste e dos exerccios' . . ...... , ........... ..... 543
Respostas do teste' ....... . ................ . ..... . .......... 543
xx Aprenda Programao Ori entada a Objetos em 21 Dias
Respostas dos exercicios' .................. . . . .... . . ... . ...... 544
Dia 20 Respostas do teste e dos exerccios' .... . .. .. .. . . ......... 548
Respostas do leste' ............... . .............. .. ......... 548
Respostas dos exerccios' ................................... 548
Dia 2 1 Respostas do teste e dos exerccios' . . ... . .......... . ...... . .. 553
Respostas do leste' ........... . ..... . ............. .. .. . ..... 553
Respostas dos exerccios' ............... . . ... . . . . .... . . . ... 554
Apndice B Resumo do Java 555
O Java Developer's Kit: J2SE 1.3 SDK ............ . . . . . ... ... .. . . .. 555
Configurao do ambiente de desenvolvimento' ............... . . . . 556
Panorama das felTamentas do SDK ..... . . .. . .... .. .. . .......... ... 557
Compil ador Java: javac' .... . . . .. . .............. . .... ... .. . . . . 557
Int erpretador Java: java ' .. . .. . . .. .. . . .. . . .. ........... . . . .. . . 558
Uti li trio de compactao de arqui vos Java: jar . . . .. .... ... . . .... . 558
Documentao Java e o gerador de documentao: javadoc .... .. ... .. . . 559
Cercadinho Java: seu primeiro programa Java .. .... . ............... . . 560
Compi lando e executando ' ..................................... 561
Cri ando um arqui vo .jar . .... . .......... . . ............... ... 562
Gerando j avadoc' ........... . .... ...... . ..... . .. . .. . ....... 563
Mecnica da li nguagem Java' ... . .. .. . . .... . . .. .. .. . . . . . . .. ... 564
Classe Java simples ........ .... .. .. . .. .... . . ..... . .. ..... 564
Ti po de Dados ............ . .... . . ..... ..... . ..... . ....... 565
Variveis' ...... . .... . ... . .......................... . 566
Constantes ............ . ... . .. .. . . .. . ............ ....... 568
Operadores' .. . .. . ....... .. ................. .. .... . .. . ... 568
Est ruturas condi cionais' . .. . . ..... . .. . . . ............... . .. . . . 570
Laos ou estruturas de repetio" . .. . .. . . .... .. ......... . ...... 57 1
Classes e interfaces - blocos de construo da linguagem Java ' .... . .. . . . . 57 1
Usando classes j ex istentes' . . .. . .. . . .. . .... .. ................ 572
Cri ando suas prprias classes ....... ............... . .. . .. . ...... 572
Int erfaces' . .... . .. . . .. . .. . .. . .... ...... . ............ . .. ... . 575
Classes internas e classes internas anni mas' .... . . .... . .... . .. , .... 577
Resulno ... . .. . .. . ........ .. ....... . .. . .. . .. . . . ... . . . . .... . . 579
Apndice C Referncia da UML 581
Referncia da UM L ............ . ... . . . .... . . ........... . .... . 581
Classes' .............. . .... . .......... .... ................ 581
Objeto ............... ..... . ...... .. . . . ............... 581
Visibilidade " ......... . ............... . ..... . .... .. ..... 581
Classes e mtodos abstralOs ' .... .. .............. . . .. .. .. . .... 582
Notas ...................... . . .. .. ... . ... . .. . . ... . . . .. .... 582
Esteretipos ' ............ . .... . .. ... . . . .... .... .. ... . .... . 583
Relacionamentos ' .... . . . .. ........... . ... . . . .. . . .. ..... . ..... 583
Sumrio
Dependncia ..... .... . . . . .. . . ..... .. ... .... .. . . . ... ... 583
Associao ' ...... . . . .. .. . . .. . .... . . . .. .. .. . . ......... 584
Papis' ...... ... . . ..... . ............... .. ..... ... ... ... 584
Multipl icidade ........... . .......... ................... 584
Agregao ........... ..... ... . ... . .................... 585
COlnposio ........... ...... ... .. .......... . .. ..... ..... 585
General izao' ................... .... ... . . .. .... . . .. .. 585
Diagramas de inlerao' ...... . .. . . . . ... .. .. . ... . .... . . ... .. 586
Diagramas de colaborao ............ . . .. . . .. .. . . ... .... . . ... 586
Diagramas de seqUncia' . .. . .... .. ..................... . . . . 586
Apndice O Bibliografia selecionada
587
Anlise, projeto e metodologias' . . . .. . ....................... . . . . 587
Programal'lo com C++ . .... .. . . . .. .. . . .. .. .. . . .. .. . . .. .. . . 588
Padres de projeto ........ ............ .... . . . .. . . .. .. .. . .. ... 588
Principios e teoria geral da 00 .. . . .. .. ............ . . .. . . . .... . . 588
Teoria "Hard Core" (mas no deixe isso assust- lo!) . . ............... 588
Programallo com Java' ................... ............ ........ 589
Miscelnea ' ........... ................ ..................... 589
Snl alltalk ................... . ..... ...... . ... ................. 589
Teste' .......................................... .... ........ 589
Apndice E Listagens do cdigo do jogo vinte-e-um 591
blackjack.core ..................... ................... . ...... 592
blackjack.core.lhreaded ..... . ................ ............ . ..... . 6 19
blackjack.exe .... ......................... ........ .. ..... 62 1
blackjack. players ........ . .. . ......... ........ . ... ........ 627
blackjack. ui ........... . .. .. .... . .. . ............... ... ...... 635
...... . . . . . ... ... . . .... . . ... . .. .. .. ... ....... 636
blackjack. ui.pac ... . .. . .. .. . ... ... ... ... .. . . . .. . . . ... ....... 649
(ndice Remissivo 669
Introduo
Este livro adota uma estratgia prtica para ens inar programao orienlada a objclos (POO). Em
vez de ensinar POO em um nvel acadmico, este li vro apresenta lies e exemplos acessveis e
amigveis, para pennitir que voc comece a aplicar POO imediatamente. Em vez de tenlar ensi-
nar cada detalhe terico, este li vro destaca os assuntos que voc precisa conhecer para poder
aplicar POO em seus proj etas dirios - e no perder seu tempo se degladiando em algum debate
terico.
o objetivo deste li vro fornecer a voc uma base slida sobre programao ori entada a objelos.
Aps 21 dias, voc dever ter lima boa idia dos concei tos bs icos da POO. Usando essa base,
voc pode comear a apli car conceitos de POO em seus projetas dirios, assi m como cont inuar a
construir seus conhecimentos de 00, atravs de estudo adicional. Voc no aprender tudo a
respeito de POO em 21 dias - isso simplesmente no possvel. Entret8llto, possvel construir
uma base slida e comear com o p direito. Este livro o ajuda a fazer exatamente isso.
Dividimos este li vro em trs partes. A Semana I apresenta os trs princpios da POO (tambm
conhecidos como os trs pilares da POO). Esses trs princpios fonnam a base da teoria da orien-
tao a objetos. O entendimento desses trs princpios absolutamente fundamental para enten-
der POO. As lies da semana esto divididas entre apresentao da teoria e o fornec imento de
experincia prtica, atravs de laboratrios.
A Semana 2 apresenta o processo de desenvolvimento de software 00. Embora as lies do Ca-
ptulo I, "llllroduo programao orientada a objetos", sejam importantes, mand-lo progra-
mar sem qualquer outra instruo como dar a voc madeira, uma serra, um martelo e alguns
pregos, e dizer para construir uma casa. A Semana 2 mostra como aplicar as ferramentas apre-
sentadas nas I ies da Semana I.
A Semana 3 o conduz em um estudo de caso completo, de um jogo de cartas 00. Esse estudo
permitir que voc percorra um ciclo de desenvolvimento 00 inteiro, do incio ao fim, assi m
como prat ique a escrita de algum cd igo. Esperamos que esse estudo de caso ajude a esclarecer a
teoria da 00 e torne as coisas mai s concretas.
Tambm existem vrios apndices no final do livro. De importncia especial o "Resumo do
Java", no Apndice B, e a bibliografia selecionada, no Apndice D, O Apndice B serve como
um gui a excelente para a linguagem de programao Java. A bibliografia mostra os recursos que
voc desejar consultar, quando conti nuar seus estudos de POO. Esses recursos certamente fo-
ram valiosos para escrever este livro.
Sobre os exemplos
Todos os exemplos de cdigo-fonte foram escritos em Java. A Iguma experincia em Java ajuda-
r; entretanto, o Apndice B deve ajud-lo a ter velocidade, caso voc esteja enferrujado ou mln-
ca tenha visto a linguagem antes. Desde que voc tenha algum conhecimento de programao,
os exemplos 5<10 os mai s acess veis. Os recursos e truques especiais do Java foram particular-
mente evitados nos exemplos.
o que voc precisa saber para usar este livro
Este li vro presume alguma experincia anterior em programao e no lenta ensinar programa-
o bsica. Este livro pega o conhecimento que voc j tem e mostra como pode us-lo para es-
crever sofi ware orientado a objclos. Ou escrever software orientado a obj elos melhor. Isso no
quer dizer que voc precisa ser um guru de programao para ler e enlender este livro - um cur-
so de programao introdutrio ou simplesmente a leitura de um li vro de programao todo o
conhecimento que voc deve precisar.
Para poder tirar total proveito dos exemplos e exerccios, voc tambm precisar de um compu-
tador com acesso Internet. A escolha do ambiente operacional e do editor fi cam completamen-
te por conta de seu gosto pessoal. O nico requisi to que voc possa fazer download, instalar e
executar Java. O Apndice B o conduz pelo processo de obteno de um SDK Java.
Finalmente, voc precisa de determinao, dedicao e uma mente aberta. A programao orien-
tada a objetos no fci l e voc demorar mais de 21 dias para dominar, mas aqui voc pode ter
um incio bom e slido.
O mundo maravilhoso da roo est espera ....
SEMANA 1
Definindo 00
I Introduo programao ori entada a objetos
2 Encapsul amento: aprenda a manter os detalhes
consIgo mesmo
3 Encapsulamento: hora de escrever algum cdigo
4 Herana: obtendo algo para nada
5 Herana: hora de escrever algum cdigo
6 Polimorfismo: aprendendo a prever o fut uro
7 Polimorfismo: hora de escrever algum cdigo
Panorama
Os prximos sete dias fornecer dO a voc uma base slida sobre programao ori entada a objelos.
O Dia I descreve os fundamentos da 00 (ori entado a objetos). Voc aprende a respeito de orien-
tao a objelos a parti r de uma perspectiva histrica e v como a 00 evoluiu a partir de li ngua-
gens de programao existentes. Voc tambm aprende a termi nologia bsica, ass im como as
vantagens e armadi lhas da programao orientada a objetos.
Os dias 2, 4 e 6 apresent am os trs pitares da programao orientada a objelos: encapsulamenlo,
herana e polimOlfismo. Esses captul os no apenas expli cam os fundamentos da programao
orientada a obj elos, mas como e quando us-los, assi m como os erros a serem evitados.
Os dias 3, 5 e 7 fornecem laboratrios correspondentes a cada um dos trs pilares. Cada capitulo
de laboratrio fornece experi ncia prtica que lhe penn ite se fami liarizar-se com os pi lares apre-
sentados nos dias 2, 4 e 6.
Aps concluir a primeira semana, voc dever ter um entendiment o completo do qu constitui
um programa orientado a objetos. Voc deve poder identificar os trs pilares da 00 e aplic-los
em seu cdigo.
Testes e exerccios seguem a li o de cada dia, para ajud-lo a entender melhor os assuntos abor-
dados. As respostas de cada pergunta dos testes e exerccios aparecem no Apndice A.
SEMANA 1
DIA
Introduo programao
orientada a objetos
Embora as linguagens orientadas a objetos j existam desde a dcada de 1960, os ltimos 10
anos tm vi sto um cresci mento sem paralelo no uso e na aceitao de tecnologias de objeto, por
todo o selar de software. Embora tenham comeado como algo secundrio, slIcessos recentes,
como Java, CORBA e C++, tm impulsionado as tcnicas orientadas a objetos (00) para novos
nveis de acei tao. Isso no por acaso. Aps anos presa nos meios acadmicos e tendo de lutar
uma rdua batalha contra as prticas entrincheiradas, a programao orientada a objetos (POO)
amadureceu at o ponto onde as pessoas so finalmente capazes de perceber as promessas que a
tcnica contm. No passado, voc tinha de convencer seu chefe a permit ir o uso de uma lingua-
gem ori entada a objetos. Hoje, muitas empresas obrigam seu uso. seguro dizer que as pessoas
esto finalmente ouvindo.
Se voc est lendo este livro, fina lmente foi convencido. Provavelmente algum com um nvel
intcnnedirio de experincia em programao. Se voc conhece C. Visual Basic ou FORTRAN,
j estava nas imediaes, mas decidi u que precisa dar uma sria olhada na programao orienta-
da a objetos e torn-Ia parte de seu conjunto de habilidades.
Mesmo que voc tenha alguma experincia com uma linguagem orientada a objetos, este li vro
pode aj ud-lo a sol idificar seu entendimento de 00. Mas no entre em pnico, caso voc no
esteja fa miliarizado com uma linguagem 00. Embora este livro use Java para ensinar conceitos de
Dia 1
00, um conhecimento prvio de Java no necessrio. Se voc ficar confuso ou predsar de um
lembrete da sintaxe, basta consultar o Apndice B, " Resumo do Java".
Se voc precisa de 0 0 para se manter no mercado, termi nar seu projeto mais recent e ou satis
fazer sua prpria curi osidade, ento veio ao lugar certo. Embora nenhum livro possa ensinar
tudo que h em relao a ao, este li vro promete fornecer uma base sl ida em 00. Com essa
base, voc pode comear a praticar POO. E, mais importante, a fundamentao fornecer a
base durvel que voc precisa para continuar a aprender e, final mente, dominar esse paradig
ma de programao.
Hoj e voc aprender
Programao orientada a objetos em um contexto hi strico
A base da programao ori ent ada a objetos
As vantagens e obj eti vos da programao ori entada a obj etos
As fa lcias e armadilhas comuns associadas programao ori ent ada a objetos
Programao orientada a objetos em um
contexto histrico
Para entender o estado atual da POO. voc deve conhecer um pouco da histri a da programao.
Ningum cOllcebeu a POO da noite para o dia. Em vez disso, a POO apenas outro estgio na
evoluo natural do desenvolviment o de soft ware. Com o passar do tempo, se tomou mais fcil
identifi car as prticas que funcionam e as que comprovadamente falham. A POO combi na prti
cas comprovadas e testadas o mais efi cientemente possvel.
Novo TERMO
00 a abreviatura de orient ado a objelOs. 00 um lemlO geral que incl ui qualquer
esti lo de desenvolvi mento que seja baseado no conceito de ' objeto' - urna entidade
que exibe caractersticas e comport amentos. Voc pode aplicar uma estratgia ori entada a objetos
na programao, assim como na anlise e no projeto.
Voc tambm pode di zer que 00 um estado da mente, uma maneira de ver o mundo todo em
termos de objetos.
Simplesmente, a 00 cont m tudo que pode ser denominado como ori ent ado a objetos. Voc vai
ver o tenno 00 mui tas vezes neste livro.
Precursores da POO
Atual mente, quando usa um computador, voc tira proveito de 50 anos de refi namento. Antiga
mente, a programao era engenhosa: os programadores int roduziam OS programas diretamente
na memri a princi pal do computador, atravs de bancos de chaves (switches). Os programado--
res escreviam seus programas em linguagem binria. Tal programao cm linguagem binri a
Introduo programao orientada a objetos 5
era extremamente propensa a erros e a falta de estrutura tornou a manuteno do cdigo pratica-
mente impossvel. Alm disso. o cdigo da linguagem binria no era muito acessvel.
Quando os computadores se tomaram mais comuns, linguagens de nvel mais alto e procedurais
comearam a aparecer; a primeira foi FORTRAN. Entretanto, linguagens procedurais posterio-
res, como ALGOL, tiveram mais inOuncia sobre a 00. As linguagens procedurais permi tem ao
programador reduzir um programa em procedimentos refinados para processar dados. Esses
procedimentos refinados definem a estrutura global do programa. Chamadas seqi.lenciai s a esses
procedi mentos geram a execuo de um programa procedural. O programa termi na quando aca-
ba de chamar sua li sta de procedi mentos.
Esse paradigma apresent ou diversas melhorias em relao I inguagem binria, incluindo a adi-
o de uma estrutura de apoio: o procedimento. As funes menores no so apenas mais fceis
de ent ender, mas tambm so mai s fceis de depurar. Por outro lado, a programao procedural
limita a reutilizao de cdigo. E, com muita freqncia, os programadores produziam cdigo
de espagueti - cdigo cujo caminho de execuo se assemelhava a uma ti gela de espagueti. Fi-
nalmente, a natureza voltada aos dados da programao procedural causou alguns problemas
prprios. Corno os dados e o procedimento so separados, no existe nenhum encapsulamento
dos dados. Isso exige que cada procedimento saiba como manipularcorretamente os dados. Infe-
li zmente, um procedi mento com comportamento errneo poderia introduzi r erros se no mani-
pulasse os dados corretamente. Uma mudana na representao dos dados exigi a alteraes em
cada lugar que acessasse os dados. Assim, mesmo urna pequena alterao poderia levar a uma
cascata de alteraes, por todo o programa - em outras palavras, um pesadelo de manuteno.
A programao modular, com uma linguagem como Modula2, tenta mel horar algumas das defi -
cincias encontradas na programao procedural. A programao modular divide os programas
em vri os componentes ou mdulos constitui ntes. Ao contrrio da programao proccdural, que
separa dados e procedimentos, os mdulos combinam os dois. Um mdulo consiste em dados e
procedi mentos para manipular esses dados. Quando outras partes do programa precisam usar um
mdulo, elas simplesmente exercitam a interface do mdulo. Como os mdulos ocultam todos
os dados internos do restante do programa, fcil introduzir a idia de estado: um mdulo con-
tm informaes de estado que podem mudar a qual quer moment o.
Novo TERMO o estado de um objeto o significado combinado das variveis irllemas do objeto.
Novo TERMO Uma varivel inferna um valor mantido dentro de um objeto.
Mas a programao Ill odular sofre de duas deficincias prprias importantes. Os mdul os no
so extensveis, significando que voc no pode fazer alteraes incrementais cm um mdulo
sem abri r o cdigo a fora e fazer as alteraes diretament e. Voc tambm no pode basear um
mdul o em outro, a no ser atravs de delegao. E, embora um mdulo possa definir um ti po,
um mdulo no pode compart ilhar o tipo de oulro mdulo.
Dia 1
Nas linguagens modulares e procedurais, os dados estruturados e no estruturados tm um
' tipo'. O tipo mais facilmente pensado como o fonnalo da memria para os dados. As lingua-
gens fortemente ti padas exigem que cada objeto tenha um tipo especfico e definido. Entretanto,
os tipos no podem ser estendidos para criar outro ti po, exceto atraves de um est il o chamado
'agregao'. Por exemplo, em C, podemos ter dois tipos de dados relacionados:
typedef struct
{
'Int a;
int b;
} aBaseType;
typedef struct
{
aBaseType Base ;
i nt c;
} aDerivedType
Nesse exemplo, aDeri vedType baseado em aBaseType, mas uma est rutura de aDerivedType no
pode ser tratada di retamente como uma estrutura de aBaseType. Uma s pode fazer referncia ao
membro Base de uma estrutura aDeri vedType. Infel izmente, essa organizao lcva a cdigo que
possui muitos blocos case e if7else, pois o aplicativo deve saber como manipular cada mdulo
que encontra.
Finalmente, a programao modular tambm um hbrido procedural que ainda divide um pro-
grama em vrios procediment os. Agora, em vez de atuar em dados brutos, esses procedimentos
manipulam mdulos.
Programao orientada a objetos
A roo d o prximo passo lgico aps a programao modular, adicionando herana e polimor-
fismo ao mdulo. A roo estrutura um programa, dividindo-o em vrios objetos de alto nvel.
Cada objeto modela algum aspecto do problema que voc est tentando resolver. Escrever li stas
seqUenciais de chamadas de procedimento para dirigir o fluxo do programa no mais o foco da
programao sob a 00. Em vez disso, os objetos interagem entre si, para ori entar o fluxo global
do programa. De certa forma, um programa 00 se torna uma si mulao viva do problema que
voc est tentando resolver.
Uma estratgia de POO para software usando objetos
Imagine que voc ti vesse de desenvolver um programa 00 para implement ar um carrinho de
compras on-l ine ou um tenninal de ponto de vendas. Um programa 00 conter os objetos item,
carrinho de compras, cupom e caixa. Cada um desses obj etos vai interagir uns com os out ros
para orientar o programa. Por exemplo, quando o caixa totalizar um pedido, ele veri ficar o pre-
o de cada item.
Introduo programao orientada a objet os 7
Definir um programa em termos de objetos uma maneira profunda de ver o software. Os obje-
lOS o obrigam a ver tudo, em nvel concei tuai, do que um objeto faz: seus comportamentos. Ver
um objelo a partir do nvel concei tua i um desvio da observao de como algo feito: a imple-
mentao. Essa mentalidade o obriga a pensarem seus programas em termos nat urais e reais. Em
vez de modelar seu programa como um conj unto de procedi ment os e dados separados (termos
do mundo do computador), voc modela seu programa em objetos. Os objetos permitem que
voc modele seus programas nos substant ivos, verbos e adjet ivos do domnio de seu problema.
Novo TERMO
Novo TERMO
A implcmcnta(70 define como algo feito. Em tennos de programao, implcmcn-
la(jo o cdi go.
o dOll/inio o espao onde um problema reside. O domnio o conjunt o de conceitos
que representam os aspectos importantes do problema que voc est tent ando resolver.
Quando recua e pensa nos termos do problema que est resolvendo. voc evit a se emaranhar nos
detalhes da implementao. claro que alguns de seus objetos de alt o n vel precisaro interagir
com o computador. Entretanto, o objeto isolar essas interaes do restante do sistema. (O Dia
2, "Encapsulamento: aprenda a manter os detalhes consigo mesmo", explorar melhor essas
vantagens.)
NOTA
Em termos do carri nho de compras, ocultao de implementaosign' ica que
o cai xa no v dados brutos ao t otali zar um pedido. O caixa no sabe procurar,
em certas posies de memria, nmeros de item e outra varivel para um cu-
pom. Em vez disso, o caixa interage com objetos i tem. El e sabe perguntar
quanto custa o item.
Neste ponto, voc pode definir ohjelo fonnalmente:
Novo TERMO
Um objelo uma construo de software que encapsula estado c comportament o. Os
objetos permitem que voc modele seu software em lennos reais e abstraes.
Rigorosament e falando, um objeto urna instncia de lltna classe. A prx ima seo apresentar
o concei to de classe.
Assim como o mundo real consti tudo de objetos, da mesma forma o o software orientado a
objelos. Em uma linguagem de programao 00 pura, tudo um objeto, desde os tipos mais b-
sicos, como inteiros e lgicos, at as instncias de classe mais complexas; nem todas as li nguagens
ori entadas a objeto chegam a esse ponto. Em algumas (como o Java), primi tivas como int c fl oat,
no so tratadas como objetos.
Dia 1
o que uma classe?
Assi m como os objetos do mundo real, o mundo da POO agrupa os objelos pelos seus comporta-
mentos e atributos comuns.
A biologia classifica todos os ces, gatos, elefantes e seres humanos como mamferos. Caracle-
rislicas comparti lhadas do a essas cri aturas separadas um senso de comunidade. No mundo do soft-
ware, as classes agnlp.1.1ll objetos relacionados da mesma maneira.
Uma classe define todas as caracterst icas comuns a um ti pode objeto. Especificamente, a classe
defi ne todos os atribulos e comportamentos expostos pelo objeto. A classe define a quais men-
sagens seus objelos respondem. Quando Ulll objetoquer exercer o comportamento de outro objeto,
ele no faz isso diretamente, mas pede ao outro obj eto para que se mude, normalmente baseado em
alguma informao adicional. FreqUentemente, isso referido como 'envio de uma mensagem' .
Novo TERMO
Uma c/asse define os atributos e comportamentos comuns compartilhados por um
tipo de objelo. Os objetos de certo tipo ou classificao compartil ham os mesmos
comportamentos e atributos. As classes atuam de forma muito parecida com um cortador de mal
de ou biscoito. no sentido de que voc usa uma classe para criar ou instanciar objetos.
Novo TERMO
Atributos so as caracteristicas de uma classe visiveis externamente. A cor dos olhos
e a cor dos cabelos so exemplos de atributos.
Um objeto pode expor um at ri bul a fornecendo um link direto a alguma varivel interna ou retor-
nando o valor atravs de um mtodo.
Novo TERMO
ComporramelJ/o uma ao executada por um objeto quando passada uma mensa-
gem ou em resposta a uma mudana de estado: algo que um objeto faz.
Um objelo pode exercer o comportamenlo de outro, executando uma operao sobre esse objeto.
Voc pode ver os termos chamada de mtodo, chamada de funo ou passar lili/a mensagem,
usados em vez de executar uma operao. O que importante que cada urna dessas aes omi-
te o comportamento de um objcto.
Passagem de mensagem, operao, chamada de mtodo e chamada de fun-
o: o qu voc usa, freqentemente depende de seus conceitos anteriores.
Pensar em termos de passagem de mensagem uma maneira muito orientada
a objetos de pensar. A passagem de mensagem dinmica. Conceituai mente,
ela separa a mensagem do objeto. Tal mentalidade pode ajudar a pensar a res-
peito das interaOes entre objetos.
linguagens como C++ e Java tm heranas procedurais, onde as chamadas de
funo so estticas. Como resultado, essas tinguagens freqentemente se re-
ferem a um objeto reali zando uma chamada de mtodo a partir de outro obje-
to. Uma chamada de mtodo est fortemente acoptada ao objeto.
Este livro normalmente usar chamada de mtodo. devido sua forte ligao
com Java. Entretanto, podem existir ocasies em que o termo mensagem
usado indistintamente.
Introduo programao orientada a objetos 9
Reunindo tudo: classes e objetos
Pegue um objeto item, por exemplo. Um item tem uma descri o, id, preo unitrio, quantidade
e um desconto opcional. Um item saber calcular seu preo descamado.
No mundo da POO, voc diria que todos os objetos item so instncias da classe Item. Uma clas-
se Item poderia ser como segue:
public class Item (
private double unit_pri ce i
private double discount; Il uma porcentagem de desconto que se apl ica ao preo
private i nt quantity;
private Stri ng descr i pt i on i
private Stri ng i d;
public Item( String id , Stri ng descri ption, int quantity , doubl e price ) {
this.id id;
I
thi s.description descript i on;
if( quantity >- O ) I
this.quantily quant ity;
I
else {
l his.quantity O;
I
this.unit_price pri ce i
publi c double getAdjustedTotal() {
I
double total unit_price * quantity;
double total discount total * discount;
-
double adj usted_tot al total - total_discount;
return adjusted_total j
II apl ica uma porcentagem de desconto no preo
publ i c void setOiscount( double di scount ) I
if( dis count u 1. 00 ) {
this .discount discount;
I
else {
t his.discount 0.0;
I
I
publi C double getD1scount() t
return discount:
I
publl c int getQuantityO 1
return quantity;
I
Dia 1
public vo1d setQuantity( int quantity ) {
if( quantity >- O ) {
this.quantity z quantitYi
I
I
publ ic String getProductIDO {
return idi
I
public String getDescription() (
return descriptionj
I
I
Mtodos como
public Item( String id, String descr1ption. 1nt quantity. double pr1ce )
so chamados COI1Slr/llo r es. Os construtores inicializam um objeto durarue sua criao.
Novo TERMO
COI/Slr/IIores so mtodos usados para inicializar objctos durante sua instanciao.
Voc chama a criao de objetos de il/Slallciat7o porque ela cria uma instncia do
objeto da classe.
NOTA
No construtor e por todo o exemplo Item, voc poda notar o uso de thi s. thi s
uma referncia que aponta para a instncia do objato. Cada objato tem sua
prpria referncia para si mesmo. A instncia usa essa referncia para acessar
suas prprias variveis e mtodos.
Mtodos como setDfscountO, getDescript1onO e getAdjustedTota l O so lodos comporta-
mentos da classe I tem que retomam ou configuram atributos. Quando um caixa quer totali zar o
carrinho, ele si mplesmente pega cada item e envia ao objeto a mensagem getAdj us tedT ota 1 O .
Introduo programao orientada a objet os 11
unit_price, di scount, quantity, description e id so todas variveis internas da classe Item.
Esses valores compreendem o esladQ do objelo. O estado de um objeto pode variar com O tempo.
Por exemplo, ao fazer compras, um consumidor pode aplicar um cupom ao item. Aplicar um cu-
pom ao item mudar o estado do item, pois isso mudar o valor de discount.
Os mtodos como getAdjustedTota 10 e getoiscountO so chamados de ace:"SQres, pois eles
pennitem que voc acesse os dados internos de um objeto. O acesso pode ser direto, como no
caso de getDiscount(). Por outro lado, o objeto pode realizar processamento antes de retornar
um valor, como no caso de getAdjustedTotal O.
Novo TERMO
Os do acesso aos dados internos de um objeto. Entretanto, os (lcessores
ocultam o fato de os dados estarem em uma varivel, em uma combinao de vari-
vei s ou serem calculados. Os aces:wres permitem que voc mude ou recupere o valor e tm 'efei-
tos colaterais' sobre o estado interno.
Os mtodos como setDi scount() so chamados de l11ulanles, pois eles permitem que voc alte-
re o estado interno do objeto. Um mutante pode processar sua entrada como qui ser, antes de alte-
rar o estado interno do objeto. Pegue setD; scount () , por exemplo. setDi scount () garante que
o desconto no seja maior que 100%, antes de aplic- lo.
Novo TERMO Os 1II1I/(lI1les pennitem que voc altere o estado interno de um objeto.
Ao serem executados, seus programas usam classes como a I tem para cdar ou instanciar os obje-
tos que compem o aplicativo. Cada nova instncia uma duplicata da lt ima. Entretanto, uma
vez instanciada, a instncia transporta comportamentos e controla seu estado. Ento, o que inicia
sua vida como clone poderia se comportar de maneira mui to diferente durante sua existncia.
Por exemplo, se voc criar dois objetos item a partirda mesma classe I tem, um objeto item pode-
r ter um desconto de 10%, enquanto o segundo pode no ter descont o. Alguns itens tambm so
um pouco mais caros que outros. Um item poderia custar USS 1.000, enquanto outro poderia cus-
tar apenas US$I,98. Assim, embora o estado de um item possa variar com o passar do tempo, a
instncia ainda um objeto de Item. Considere o exemplo da biologia; um mamfero de cor cinza
to mamfero quanto outro de cor marrom.
Fazendo os objetos trabalhar
Considere o mtodo main() a seguir:
publiC static void main( String [] al"9S )
I
II cria os itens
Item mil k
,e. Item( "dairy-Oll", "I Gallon Hilk", 2, 2.50 );
Item yogurt
'e.
Item{ "dairy-032", Peach Yogurt", 4,0.68 ) ;
Item bread
00'
Item( "bakery-023" , "Sliced Bread" 1,2.55 ); ,
Item soap
,e. Item( "household-21", "6 Pack Soap , 1,4.51 ) ;
}
II aplica cupons
milk.setOiscount( 0. 15 ).
II obtm preos ajustados
Dia 1
double milk_price milk.getAdjustedTotal();
doubl e yogurt_price yogurt.getAdjustedTotal();
doubl e bread_price z bread.getAdjustedTotal().
double soap_price a soap.getAdj ustedTotal().
I I imprime recibo
System.out.println(
$ystem. out.println(
System. out.println(
System.out.print l n(
System.out.print l n(
System. out.println(
"Thank Vou For Vour Purchase." ).
"Please Come Again!" ):
milk.getOescription()
yogurt.getOescription()
bread.getOescript ion()
soap.getOescr i pt ion()
+ "\t $"
$"
$"
$"
+ "\t
+ ., \ t
+ ., \ t
II calcul a e imprime total
+ milk_pri ce
+ yogurt_price
+ bread_price
+ soap_price
double total milk_price + yogurt_price + bread_price + soap_price.
System. out.pr intln( "Total Price \t $" + total );
) ;
);
) ;
) ;
Esse mtodo mostra como poderia ser um pequeno programa que usa objetos de Item. Primeiro, o
programa instancia quatro objetos de Item. Em um programa real, ele poderia criar esses itens
quando um usuri o navegasse em um catlogo on-li ne ou quando um caixa percorre os amlazns.
Esse programa cri a vrios itens, aplica descont os e, em seguida, imprime um recibo. O programa
reali za toda a imerao do objeto enviando vrias mensagens para os itens. Por exemplo, o progra-
ma apl ica um desconto de 15% no lei te (milk), enviando a mensagem setDiscount () para o item.
O programa total iza os itens primeiro enviando a cada item a mensagem getAdjustedTotal O.
Finalmente, esse programa envia um recibo para a tela. A Figura 1.1 ilustra o exemplo de saida.
FI GURA 1.1
Imprimindo
I/m recibo.
import ante perceber que toda a programao foi feita em termos de objetos de Item e os com-
portamentos expostos pelos mtodos de I tem- os substantivos e verbos do dom nio do carri nho
de compras.
Introduo programao ori entada a objetos 13
Relacionamentos de objeto
o modo como os objetos se relacionam um componente muito importante da POO. Os objetos
podem se relacionar de duas maneiras importantes.
Primeiro, os objetos podem existi r independentemente uns dos outros. Dois objetos de Item p0-
dem aparecer no carrinho de compras si multaneamente. Se esses dois objetos separados precisa-
rem interagi r, eles interagiro passando mensagens um para o outro.
Novo TERMO
Os objetos se comunicam uns com os outros atravs de mensagens. As mensagens
fazem com que um objeto realize algo.
' Passar uma mensagem' o meSmo que chamar um mlodo para mudar o estado do objeto ou
para exercer um com port amento.
Segundo, um objeto poderia cont er outros objetos. Assim, como os objetos compem um pro-
grama em POO, eles podem compor outros objetos atravs da agregao. A partir do exemplo
Item, voc poderia notar que o objeto item contm muitos outros objetos. Por exemplo, o objeto
item tambm contm uma descri o e uma ido A descrio e a id so ambas objelos de Stri ng.
Cada um desses objetos tem uma interface que oferece mtodos e at ributos. Lembre-se de que,
na POO, tudo um objeto, mesmo as partes que compem um objclo!
A comunicao funciona da mesma maneira entre um objetoe os objetos que ele cont m. Quan-
do os objetos precisarem interagir, eles faro isso enviando mensagens uns para os outros.
As mensagens so um importante conceito de 00. Elas pennilem que os objetos permaneam
independentes. Quando um objeto envia uma mensagem para OUITO, geralmente ele no se preo-
cupa com a maneira como o objetoescol he transportar o comportamento solici tado. objeto so-
licitante se preocupa apenas que o comportamento acontea.
Voc vai aprender mais a respeito de como os objetos se relacionam, na prxima semana.
A definio de objeto est aberta ao debate. Algumas pessoas no defi nem um
objeto como uma instncia de uma classe. Em vez disso, elas definem tudo em
termos de ser um objet o: a partir desse ponto de vista, uma classe um objeto
que cri a outros objetos. Tratar uma classe como um objeto importante para
conceitos como metaclasse.
Quando este livro encontrar uma discordncia na terminol ogia, escolheremos
uma definio e ficaremos com ela. Muito freqentemente, a escolha ser
pragmtica. Aqui, opt amos por usar a definio de objeto como instncia. Essa
a definio UML (Unified Modeling Language) e a mais encontrada no set or.
(Voc vai aprender mais a respeito de UMl posteriormente.) Infelizmente, a
outra uma definio orientada a objetos mais pura. Entretanto, voc no a
encontrar muit o f reqentemente e o conceit o de metaclasse est fora dos ob-
jetivos deste livro.
Dia 1
Como a programao orientada a objetos fundamenta o
passado
Assi m como outros paradigmas lentam acent uar as vant agens e corrigir as ralhas dos paradigmas
ant eriores, a POO rundamenta a programao procedural e modular.
A programao modular est rutura um programa em vri os mdulos. Do mesmo modo, a POO
divide um programa em vrios objetos interativos. Assim como os mdulos ocultam representa-
es de dados at rs de procedi mentos, os objetos encapsul am seu estado por trs de suas interra-
ces. A POO empresta esse concei to de encapsulamento di retamente da programao modular. O
encapsul amento direre muit o da programao procedura l. A programao procedural no en-
capsul a dados. Em vez disso, os dados so abertos para todos os procedi mentos acessarem. Ao
contrrio da programao procedural , a programao orientada a obj etos acopla rort emente
dados e comport amentos ao objeto. Voc vai aprender mais a respei to do encapsulament o nos
dias2e3.
Embora os objetos sejam conceitualmente semelhantes aos mdul os, eles di rerem de vrias ma-
neiras import antes. Primeiro, os mdulos no suportam extenso pront ament e. A programao
orientada a objetos int roduz o conceito de herana para elimi nar essa deficincia. A herana per-
mite que voc estenda e mel hore suas classes raci lmenl e. A herana tambm permi te que voc
classi fi que suas classes. Voc vai aprender mais a respeito da herana no Dia 4, " Herana: ob-
tendo algo para nada" e no Dia 5, " Herana: hora de escrever algum cdigo".
A POO tambm acent ua o concei to de polimorfi smo, que aj uda a construi r programas fl exveis,
que no resistem mudana. O poli morfi smo acrescenla essa fl exibilidade limpando o sistema
de tipagem li mitado do mdulo. Voc vai aprender mais a respeito do poli morfi smo no Dia 6,
" Polimorfismo: aprendendo a prever o ruturo" e no Dia 7, " Poli morfismo: hora de escrever al-
gum cdigo".
A POO certamente no inventou o encapsul amento e o polimorfi smo. Em vez disso, a POO
combina esses conceitos em um s lugar. Pegue a noo da POO de objetos e voc reunir essas
tecnologias de uma maneira jamais rei ta.
Vantagens e objetivos da 00
A programao orient ada a objetos define seis objeti vos sobrepostos para desenvolvimento de
software. A POO se esmera em produzir software que tenha as seguintes caractersticas:
1. Natura l
2. Confivel
3. Reut ilizvel
4. Manutenvel
Introduo programao orientada a objet os 15
5. Extensvel
6. Oportunos
Vamos ver como ela funciona para atender cada um desses obj etivos.
Natural
A POO produz software natural. Os programas naturais so mais intel igveis. Em vez de progra
mar em termos de regies de memria, voc pode programar usando a terminologia de seu pro--
blema em particular. Voc no precisa se aprofundar nos detalhes do computador enquanto
projeta seu programa. Em vez de ajustar seus programas para a linguagem do mundo dos compu-
tadores, a 00 o libera para que expresse seu programa nos termos de seu problema.
A programao orientada a objetos pennite que voc modele um problema em um n vel funci o-
nal e no em nvel de implementao. Voc no precisa saber como um software funciona, para
us-lo: voc simplesmente se concentra no que ele faz.
Confivel
Para criar soft ware ti I, voc precisa criar software que seja to confivel quanto outros produ-
tos, como geladeiras e televi ses. Quando foi a ltima vez que seu microondas quebrou?
Programas orientados a objetos, bem projetados e cuidadosamente escri tos so confiveis. A na-
t ureza modular dos objetos pennile que voc faa alteraes em uma part e de seu programa, sem
afetaroutras partes. Os objetos isolam oconhecimenl o ea responsabilidade de onde pertencem.
Uma maneira de aumentar a confiabilidade atravs de testes completos. A 00 aprimora os tes-
tes, permitindo que voc isole conheci mento e responsabilidade em um nico lugar. Tal isola-
ment o pennite que voc teste e val ide cada componente independentemente. Uma vez que tenha
validado um componente, voc pode reutiliz-lo com confiana.
Reutilizvel
Um construtor inventa um novo tipo de tijolo cada vez que constri uma casa? Um engenheiro
eletricista inventa um novo tipo de resistor cada vez que projeta um circuito? Ento, por que os
programadores continuam ' reinventando a roda?' Uma vez que um problema esteja resolvido,
voc deve reutili zar a soluo.
Voc pode reutili zar prontamente classes orientadas a objetos bem feitas. Assim como os mdu-
los, voc pode reut il izar objetos em muitos programas diferentes. Ao contrri o dos mdulos, a
POO introduz a herana para penni ti r que voc estenda objetos existentes e o polimorfi smo,
para que voc possa escrever cdigo genrico.
A 00 no garante cdigo genrico. Criar classes bem feitas urna tarefa difici l que exige concen-
trao e ateno abstrao. Os programadores nem sempre acham isso fcil.
Dia 1
Atravs da POO, voc pode modelar idias gerais e usar essas idias gerais para resolver proble-
mas especficos. Embora voc v construi r objelos para resolver um problema especfico, fre-
qentemente construi r esses objetos especficos usando partes genri cas.
Manutenvel
o ciclo de vida de um programa no tennina quando voc o di stri bui. Em vez disso, voc deve
manter sua base de cdigo. Na verdade, entre 60% e 80% do tempo gasto trabalhando em um
programa para manut eno. O desenvolvi mento representa apenas 20% da equao!
Um cdigo orientado a objetos bem projetado manutenvel. Para corrigir um erro, voc sim-
pl esmente corrige o problema em um lugar. Corno uma mudana na implementao transpa-
rent e, todos os outros objetos se benefici aro aut omaticamente do aprimoramento. A linguagem
natural do cdigo deve permitir que out ros desenvolvedores tambm o ent endam.
Extensvel
Ass im como voc deve manter um programa, seus usurios exigem o acrscmo de nova funcio-
nalidade em seu sistema. Quando voc construir uma biblioteca de objetos, tambm desejar es-
tender a funcional idade de seus prpri os objetos.
A POO trata dessas real idades. O soft ware no esttico. Ele deve crescer e mudar com o passar
do tempo, para permanecer til. A POO apresenta ao programador vrios recursos para estender
cdigo. Esses recursos incluem herana, polimorfismo, sobreposio, delegao e uma varieda-
de de padres de projeto.
Oportuno
O ciclo de vida do projeto de software moderno freqentemente medido em semanas. A
POO ajuda nesses rpidos ciclos de desenvolvimento. A POO diminui o tempo do ciclo de
desenvolvimento, fornecendo software confivel, reutili zvel e facilmente extensvel.
O software nat ural simplifica o projeto de sistemas complexos. Embora voc no possa ignorara
projeto cuidadoso, o software natural pode otimizar os ciclos de projeto, pois voc pode se con-
centrar no problema que est tent ando resolvcr.
Quando voc divide um programa em vri os objetos, o desenvolvi mento de cada parte pode
ocorrer em paralelo. Vrios desenvolvedores podem trabalhar nas classes independentemente.
Tal desenvolvimento em paralelo leva a tempos de desenvolvimento menores.
Armadilhas
Quando voc aprende 00 pela primeira vez, existem quatro annadilhas que precisa evitar.
Introduo programao orientada a objetos
Armadilha 1: pensar na POO simplesmente como uma
linguagem
17
Freqentement e, as pessoas equiparam linguagens orientadas a objetoscom a poo. O erro surge
ao supor que voc est programando de maneira ori entada a obj etos si mplesment e porque usa
uma linguagem ori entada a objetos. Nada poderia estar mais distante da realidade.
A POO muito mais do que simplesmente usar uma linguagem orientada a objetos ou conhecer
ceno conjunto de definics. Voc pode escrever cdigo horrivelmente no orientado a obj etos
em uma linguagem ori entada a objetos. A verdadeira POO um estado da mente que exige que
voc veja seus problemas como um grupo de objetos e use encapsulament o, herana e polimor-
fismo corretam ente.
Infeli zmente, muitas empresas e programadores supem que, se simplesment e usarem Lima lin-
guagem orientada a objetos, se beneficiaro de todas as vantagens que a POO oferece. Quando
falham, elas tentam culpar a tecnologia e no o fato de que no trei naram seus funcionrios cor-
retamente, ou que agarraram um conceito de programao popular sem entender realmente o que
ele significava.
Armadilha 2: medo da reutilizao
Voc deve aprender a reutilizar cdigo. Aprender a reutili zar sem culpa freqUentemerlle uma
das lies mais dificeis de aprender, quando voc escolhe a POO pela primeira vez. Trs proble-
mas levam a essa dificuldade.
Primeiro, os programadores gostam de cri ar. Se voc ol har a reutilizao de modo errado, ela pa-
recer afastar algumas das alegrias da criao. Entretanto, voc precisa lembrar que est reutilizan-
do panes para criar algo maior. Pode no parecer interessante reutilizar um componente, mas isso
permi tir que voc construa algo ainda melhor.
Segundo, muitos programadores sofrem do sentimento de 'no escrit o aqui' - signi fi cando que
eles no confiam no software que no escreveram. Se um software bem testado e atende sua ne-
cessidade, voc deve reuli liz-Io. No rejeite um componente porque voc no o escreveu. Lem-
bre-se de que reutilizar um componente o liberar para escrever outro software maravilhoso.
Armadilha 3: pensar na 00 como uma soluo para tudo
Embora a POO oferea muitas vantagens, ela no a soluo para tudo no mundo da programa-
o. Existem ocasies em que voc no deve usar 00. Voc ainda precisa usar bom senso na es-
colha da ferramenta correta para o trabalho a ser feito. Mais importante, a POO no garant e o
sucesso de seu proj eto. Seu projeto no ter sucesso automaticamente, apenas porque voc usa
uma li nguagem 00. O sucesso aparece somente com planejament o, projeto e codificao cui-
dadosos.
Dia 1
Armadilha 4: programao egosta
No seja egosta quando programar. Assim como voc deve aprender a reutil izar, tambm deve
aprender a compartil har o cdigo que cri a. Compart ilhar significa que voc encoraj ar outros de-
senvolvedores a usarem suas classes. Entretanto, compart ilhar tambm signifi ca que voc toma-
r fcil para outros reutili zarem essas classes.
Lembre-se dos outros desenvolvedores quando voc programar. Faa interfaces limpas e inteli-
giveis. Mais importante, escreva a documentao. Documente suposies, parmetros de mto-
dos, documente o mximo que voc puder. As pessoas no reuti li zaro o que no podem
encontrar ou entender.
A prxima semana
Na prxima semana, voc continuar sua introduo a roo, aprendendo a respeito dos trs pi la-
res que fonnam a base da tcoria da POO: encapSlllamenlo, herana e polimorfismo.
Cada pilar ser dividido em duas lies. A primeira lio apresentar o pi lar e a teoria subjacen-
te. A segunda lio fornecer experincia prt ica com os conceitos apresentados no dia anterior.
Essa estratgia espelha a estratgia de preleo/laborat ri o, usada com sucesso por mui tas uni-
versidades e escolas.
Voc completar todos esses laboratrios usando a linguagem de programao Java da Sun Mi
crosystem. Voc pode obter gratui tamente todas as ferramentas usadas neste livro, atravs da
World Wide Web. O Dia 3, assi m como o Apndice B, " Resumo do Java", no fi nal do livro, o
conduziro na obteno e configurao de seu ambiente de desenvolvi mento.
NOTA
Resumo
Por que Java 7
Exi stem dois motivos para se usar Java como fer ramenta de ensino. Primei ro,
o Java o abstrai perfeitamente dos det alhes da mquina e do sist ema opera-
cional. Em vez de ter de se preocupar com alocao e desalocao de mem-
ria, voc pode simplesmente se concentrar no aprendizado dos objetos.
Finalmente, aprender boas prticas orientadas a obj etos em Java prtico.
Voc pode pegar o conhecimento e fazer um trabalho. Al gumas li nguagens
silo mais orientadas a objetos do que o Java. Entretanto, f cil fazer o Java
funcionar.
Hoje, voc fez um passeio pela programao orientada a objetos. Voc comeou vendo a evolu-
o dos pri ncipais paradigmas de programao e aprendeu al guns dos fundamentos da roo.
Agora, voc deve entender as idias conceit uais por trs da 00, como o que uma classe e como
os objetos se comunicam.
Introduo programao orientada a objet os 19
Defini es so import antes, mas nunca devemos perder o rumo do que estamos tentando fazer
usando 00, nos atendo ao ' como' do que est ivennos fazendo. As seis vanlagens e objeti vos resu-
mem o que a programao orientada a objetos espera cumprir:
1. Natural
2. Confi vel
3. Reuti li zvel
4. Manutenvel
5. Extensvel
6. Oportuna
Voc nunca deve perder esses objetivos de vista.
Perguntas e respostas
P o que posso fer para dominar a POO?
R Li vros como este so uma boa maneira de comear em sua jornada para dominar a 00.
importante construir uma base slida; uma que voc possa desenvolver.
Uma vez que tenha uma base, voc precisa comear a praticar 00 ativamente. O verda-
deirodomnio s vem com a experincia. Comece como um desenvolvedorem um proje-
to 00. Conhea profundamente o assunto. Quando voc se tornar mais famil iarizado
com a 00, comece a se envolver na anlise e no projeto de seus trabalhos.
Tambm aj uda encontrar um mentor. Encontre al gum que esteja desejoso de passar al -
gum tempo compartilhando sabedori a. Instruir-se com os outros a maneira melhor e
mais rpida de aprender POO.
Finalmente, continue seu estudo pessoal. Leia livros, artigos, participe de conferncias.
Voc sempre pode absorver mais informaes.
Workshop
As perguntas e respostas do teste so fornecidas para seu melhor entendiment o. Veja as respos-
tas no Apndice A, "Respostas".
Teste
I. o que programao procedural?
2. Qual vantagem a programao procedural tem cm relao programao no estruturada?
3. O que programao modular?
Dia 1
4. Quais vantagens a programao modul ar tem em relao programao procedural?
S. Liste uma deficincia da programao procedural e da programao modular.
6. O que programao orientada a objetos?
7. Quais so as seis vantagens e objetivos da programao orientada a objetos?
8. Explique um dos obj etivos da programao orientada a objetos.
9. Defina os seguintes lermos:
Classe
Objeto
Comportamento
10. Como os obj etos se comunicam ent re si?
I I. O que um construtor?
12. O que um acessor?
13. O que um mutante?
14. O que thl S?
Exerccios
Alegre-se! Para hoj e, voc no tem exerccios escritos. Em vez disso, d um passeio.
SEMANA 1
DIA
Encapsulamento: aprenda a
manter os detalhes consigo
mesmo
Esperamos que o Dia I, " Introduo programao orientada a objetos", tenha aguado seu in-
teresse e que voc provavelmente tenha mui tas perguntas. Conforme voc pode imaginar, existe
muito mai s na programao orientada a objetos do que algumas defi nies simples. Ao adotar
uma estratgia de 00 para desenvolvimento de software, voc no pode simplesmente sair pro-
gramando. Em vez di sso, voc deve ler um planejamento cuidadoso e lima boa base nas impor-
tantes teorias existentes por trs da POO. Infelizmente, no h uma maneira prti ca de se tornar
um especialista em POO cm poucos anos, imagine em 21 dias! Em vez di sso, voc precisa voltar
e perguntar, "o que estou lentando fazer?" Voc est tentando se tornar um especiali sta terico
ou um profissional prtico? Voc sabe, preciso ser um pouco mai s prt ico se quiser aprender
00 suficient emente para fazer seu trabalho. Felizmente, voc no precisa de um doutorado para
entendere apl icar 00 em seus projetas de soft ware eficientemente. O que voc precisa de uma
mente aberta e o desejo de aprender - ou desaprender, em muitos casos.
Hoje e no restante da semana, voc dar uma olhada prt ica nas teorias subjacent es a POO: as
ferramentas de 00. Essas teorias devem lhe dar uma base suficiente para comear a experimen
tar a POO. Ent retanto, o domnio no vir rapidament e. Assim como qual quer outra habili dade,
seus conheci mentos de POO melhoraro e aumentaro apenas com estudo e prt ica.
Dia 2
Hoje voc vai aprender:
Sobre os trs pilares da programao orientada a objetos
Como apl icar encapsulamento efi cazmente
Como programar de forma abstrata
Como os ti(X)s abstratos de dados formam a base do encapsulamento
A diferena entre interface e implementao
Sobre a importncia da responsabi li dade
Como o encapsulamento ati nge os objetivos da 00
Os trs pilares da programao orientada a
objetos
Para edi fi car seu entendimento c domnio de 00, voc deve primeiro ter uma base slida a partir
da qual possa expandi r sua compreenso. Primeiro, voc precisar identi ficar, definir e explorar
os conceitos bsicos da 00. Somente quando voc tiver uma boa base das teorias bsicas de 00
que poder aplic-la corretamente no software que escrever. Tal discusso o leva naturalmente
aos trs conceitos que devem estar present es para que uma I inguagem seja considerada realmen-
te orient ada a objetos. Esses trs conceitos so freqentcmente referidos como os Irs pilares da
programao ori entada a objetos.
Novo TERMO
Os Irs pi/ares da programao orienlada a obj etos si'lo: eI1CapSIlItl/lIeIllO, herana e
poIiIllOlfi:m/O.
Como a 1>00 baseada neles, os trs pilares so semelhant es a uma torre de bl ocos: remova o
bloco inferior e tudo mais vir abaixo. O encapsul amento, que voc abordar hoje, uma pea ex-
tremamente importante do quebra-cabea, pois ele forma a base da herana e do pol imorfismo.
Encapsulamento: o primeiro pilar
Em vez de ver um programa como uma nica entidade grande e monolt ica, o encapsul amento
permite que voc o divida em vrias partes menores e independentes. Cada parte possui imple-
metllai'lo e realiza seu trabal ho independentemente das out ras partes. O encapsul amento man-
tm essa independncia, ocultando os detalhes internos ou seja, a implementao de cada parte,
atravs de uma interface externa.
Novo TERMO
Encapsulamento a caracterstica da 00 de ocultar partes independentes da imple-
mentao. O encapsulamento pennite que voc construa partes ocultas da imple-
mentao do soft ware, que at injam uma funcionalidade e ocultam os detalhes de implementao
do mundo exteri or.
Encapsulamento: aprenda a manter os det al hes consigo mesmo 23
NOTA
Se voc no estiver famil iarizado com o termo encapsulamento, talvez reco-
nhea os termos mdulo, componente ou bean. Voc pode usar esses termos
em vez de 'software encapsulado'.
Uma vez encapsulado, voc pode ver uma entidade de software como lima caixa preta. Voc
sabe o que a caixa preta faz, pois conhece sua interface externa. Conforme a Figura 2.1 ilustra,
voc si mpl esmente envia mensagens para a caixa preta. Voc no se preocupa com o que aconte-
ce dentro da caixa; voc s6 se preocupa com o fato de que isso acontea.
FIGURA 2. 1
Uma caixa preta.
INTERFACE
Men,egem
Mensagem
INTERFACE
NovO TERMO
Uma il/lelje/ce li sta os servios fornecidos por um componente. A interface um
contrato com O mundo exterior, que define exatamente o que uma entidade externa
pode fazer com o objeto. Uma interface o painel de controle do objcto.
Uma interface importante, pois ela diz o que voc pode fazer com o compo-
nente. O mais interesse o que uma interface nAo informa: como o compo-
nente far seu trabalho. Em vez disso, a interface oculta a implementao do
mundo exterior. Isso li bera o componente para alteraes na sua implementa-
o a qualquer moment o. As mudanas na implementao no mudam o cdi-
go que usa a classe, desde que a interface permanea inalterada. As alteraes
na interface necessitaro de mudanas no cdigo que exerce essa interface.
Novo TERMO
Dia 2
Talvez voc esteja familiari zado com o t ermo de programao APl (Int erface de
Programa Apli cati vo). Uma interface semel hante a APl para um objeto. A in-
terface lista t odos os mtodos e argumentos que o objeto entende.
A implementao define como um componente realmente fomece um servio. A im-
plementao define os detalhes int ernos do componente.
Um exemplo de interface e implementao
Consi dere a classe Log a seguir:
publi c class Log {
}
public void debug( String message ) {
pri nt ( "DEBUG ". message ) i
}
publiC void info( String message ) {
print( "INFO ", message }i
}
public void warn ing( Stri ng message ) {
pr i nt( "WARN ING ", message )i
}
public void er ror( Str ing message } I
print{ "ERROR ", message }i
}
public void fatal( Stri ng message ) I
print( "FATAL ", message ) ;
System.exit( O ) i
}
private void print ( String message , Str ing severity ) {
Sys tem.ou t. println{ severity + ": " + message )j
}
A classe Log contm objctos para relatar mensagens de depurao, infonnativas, de aleT1a e de
erro, durante a execuo. A interface da classe Log constituda de todos os compoT1amentos di s-
ponveis para o mundo exterior. Os eomponamentos disponveis para o mundo exterior so conhe-
cidos como interface pblica. A interface pblica da classe l og inclui os seguintes mtodos:
public void debug( St ring message )
public void i nfo( String message )
publ i c void warning( String message )
public void er ror ( String message )
public void fatal ( String message )
Encapsulamento: aprenda a manter os detal hes consigo mesmo 25
Tudo mais na definio da classe, alm dessas ci nco declaraes de mtodo, implementao.
Lembre-se de que a implementao define como algo fei to. Aqui, o 'como' o fato de que log
imprime na tela. Entretanto, a interface oculta completamente o 'como'. Em vez disso, a inter-
face define um contrato com o mundo exterior. Por exemplo, publ'i c vo'id debug ( String message )
uma maneira de dizer ao mundo exterior que, se voc passar uma Stri ng, ela reportar uma
mensagem de depurao.
O que importante notar o que a interface no diz. debug O no diz que impri mi r na tela. Em
vez disso, o que feito com a mensagem deixado para a implementao. A implementao p0-
deria escrever na tela, descarregar em um arquivo, gravar em um banco de dados ou enviar uma
mensagem para um cliente monitorado pela rede.
Pblico, privado e protegido
Voc pode ter notado que a interface pblica no incl ui
private void print( Stri ng message , String severity ).
Em vez disso, a classe log restringe o acesso a pri nt O .
O que aparece e o que no aparece na interface pblica governado por di versas palavras-chave.
Cada li nguagem 00 define seu prprio conjunto de palavras-chave, mas fundamentalment e es-
sas palavras-chave acabam tendo efeitos semelhantes.
A maioria das linguagens 00 suporta trs nveis de acesso:
Pbli co - Garante o acesso a todos os obj etos.
Protegido - Garante o acesso instncia, ou seja, para aquele objeto, e para todas as sub-
classes(mai s informacssobre subclasses no Dia4, "Herana: obtendo algo para nada").
Pri vado - Garante o acesso apenas para a instncia, ou seja, para aquele objeto.
O nvel de acesso que voc escolhe muito import ante para seu projeto. Todo comportamento
que voc queira tornar visvel para o mundo, precisa ter acesso pblico. Tudo que voc quiser
ocultar do mundo exterior precisa ter acesso protegido ou privado.
Por que voc deve encapsular?
Quando usado cuidadosamente, o encapsulamento transforma seus objetos em componentes
plugveis. Para que outro objeto use seu componente, ele s precisa saber como lIsar a interface
pbl ica do componente. Tal independncia tem trs vantagens importantes:
Independncia significa que voc pode reutili zar o objeto em qualquer parte. Quando
voc encapsular corretament e seus objetos, eles no estaro vinculados a nenhum progra-
ma em particular. Em vez disso, voc pode us-los sempre que seu uso fizer sentido. Para
usar o objeto em qualquer lugar, voc simplesmente exerce sua interface.
O encapsulamento pennite que voc tome transparentes as alteraes em seu objeto. Des-
de que voc no altere sua interface, todas as alteraes pennanecero transparentes para
Dia 2
aqueles que estiverem usando o objeto. O encapsulamento penn ite que voc atualize seu
component e, fornea uma implementao mais eficiente ou corrija erros - tudo isso sem
ter de tocar nos outros objetos de seu programa. Os usurios de seu objeto se benefi c iaro
automaticamente de todas as alteraes que voc fi zer.
Usar um objeto encapsulado no causara efeitos colaterais inesperados entre o objeto e o
restante do programa. Como o objeto tem implementao independente, ele no tera ne-
nhuma oll1ra interao com o restante do programa. alm de sua interface.
Agora, voc est em um ponto onde podemos falar sobre algumas generalidades a respeito do
encapsulamento. Voc viu que o encapsulamento pennite escrever componentes de software
com implementaes independentes. As trs caractersticas do encapsulamento eficaz so:
Abstrao
Ocultao da implementao
Divi so de responsabilidade
Vamos ver mais profundamente cada caracterstica, para aprender a melhor maneira de obter o
encapsulamento.
Abstrao: aprendendo a pensar e programar
de forma abstrata
,
Embora as linguagens 00 estimulem o encapsul amento, elas no o garantem. E fci l construir
cdigo dependente e frgil. O encapsulament o efi caz vem apenas com um projeto cuidadoso.
abslrao e experincia. Um dos primei ros passos para o encapsulamento eficaz aprender
como abstrair software e os conceitos subjacentes eficientemente.
o que abstrao7
Abstrao o processo de simplificar um probl ema difici!. Quando comea a resolver um pro-
blema, voc no se preocupa com cada detalhe. Em vez disso, voc o simplifica, tratando apenas
dos detalhes pertinentes a uma soluo.
,
Imagine que voc tenha de escrever um simulador de fluxo de trfego. E poss vel que voc mo-
dele classes para sinais de trnsito, veculos, condies da pista, aut o-estradas, ruas de mo du-
pla, ruas de mo nica, condies climticas etc. Cada um desses elementos afetaria o fluxo do
trfego. Entretanto, voc no modelari a insetos e pssaros no sistema, mesmo que eles possam
aparecer em uma via real. Alm disso, voc omitiria tipos especficos de carros. Voc simplifica
o mundo real e inclui apenas as partes que realmente afetam a simul ao. Um carro muito im-
portante para a simul ao, mas o fato de ser um Cadillac ou fazer com que o carro controle seu
nvel de combustvel suprfl uo para a simulao de trfego.
A abstrao tem duas vantagens. Primeiro, ela permite que voc resolva um problema faci lmen-
te. Mais importante, a abstrao o ajuda a obter reuti lizao. Muitas vezes, os componentes de
Encapsulamento: aprenda a manter os det al hes consigo mesmo 27
software so demasiadamente especializados. Essa especial izao, combinada com uma inter-
dependncia desnecessria entre os componentes, torna diflci l reutilizar um cdigo existente em
outra parte. Quando possivel, voc deve se esrorar por criar objetos que possam resolver um do-
mnio inteiro de problemas. A abst rao penni te que voc resolva um problema uma vez e de-
pois use essa soluo por todo o domnio desse problema.
NOTA
Embora seja desejvel escrever cdigo abst rat o e evitar uma especi ali zao
demasi ada, duro escrever cdigo abstrat o, especial mente quando voc co-
mea a praticar a POO.
Existe uma li nha tnue entre muita e pouca especializao. A linha pOde ser
di scernida apenas com a experinci a. Entretant o, voc precisa saber desse po-
deroso conceito.
Dois exemplos de abstrao
Considere dois exemplos.
Primeiro, imagine pessoas em fil a em um banco, esperando por um caixa. Assim que um caixa se
toma disponvel, a pri mei ra pessoa da fil a avana para a janela aberta. As pessoas sempre dei-
xam a fil a na ordem de que o pri meiro a entrar o pri meiro a sai r (FI FO): essa ordem sempre
mantida.
FIGURA 2 .2
Uma fi la em
11111 IXII/co.
ENTRADA A
I I
L _ _ _
Cliente 5
Banco de 00
3
SAlDA
Cliente 1 Ceixe 1
Cliente 2 C. iu 2
C. ix.3
Dia 2
Segundo, considere um estabelecimento de sanduches do tipofasl food. Quando um novo san-
duche fi ca pronto, ele colocado atrs do lti mo sanduche que est no escani nho; veja a Figura
2.3. Desse modo, o primeiro sanduche ret irado tambm o mais anti go. FIFO o esquema do
restaurant e.
FI GURA 2.3
Sandlliches fic(lndo
P"OIlfO.f.
Embora cada um desses exemplos seja especfico, voc pode encontrar uma descrio
genri ca que funcione em cada situao. Em outras palavras, voc pode chegar a uma
abstrao.
Cada domni o um exemplo de fila do tipo primeiro a entrar, pri meiro a sair. No importa quais
tipos de elementos apaream na fil a. O que importa que os elementos ent ram no final da fil a e
saem dela a panir da frente, confonne il ustrado na Figura 2.4.
FIGURA 2.4
UII/tI abSfra(((io de
ambos os domnios.
ENTRADA
Abstraindo os domnios, voc pode cri ar uma fila lima vez e reutiliz- Ia em qualquer problema
que modele um domni o onde exista uma ordenao FIFO de elementos.
Abstrao eficaz
Neste ponto, voc pode formul ar algumas regras para a ahstrao eficaz:
Trate do caso geral e no do caso especifico.
Ao confrontar vrios problemas diferent es, procure o que for comum a todos. Tente ver
um conceito e no um caso especfico.
No se esquea de que voc tem um problema a resolver. A abstrao vali osa, mas no
descuide do problema na esperana de escrever cdigo abstrato.
A abst rao pode no estar prontamente aparente. A abstrao pode no saltar sua frente
na pri meira, segunda ou terceira vez que voc resolver um problema que est suj eito a ser
abstrado.
Encapsulamento: aprenda a manter os detal hes consigo mesmo 29
Prepare-se para a falha. quase impossvel escrever uma abstrao que funcione em to-
das as situaes. Voc ver por que, posterionnente ainda hoje.
ALERTA
NeTA
No caia na parali sia da abstrao. Resolva os problemas que voc encontrar
primei ro. Veja a abstrao como um bnus e no como o objet ivo final. Caso
contrrio, voc vai se deparar com a possibil idade de prazos finais perdidos e
abstrao incorreta. Existem ocasi es para abstrair e ocasies em que a abs-
trao no apropriada.
Uma boa regra g e r ~ abstrair algo que voc tiver implementado trs vezes de
maneira anloga. A medida que voc ganhar experincia, aprender a esco-
lher a abst rao mais rapidamente.
Nem sempre voc pode reconhecer oportunidades para uma abstrao. Tal vez
voc tenha de resolver um problema vrias vezes, antes que uma abstrao se
torne aparente. s vezes, diferentes situaes ajudam a encontrar uma abstra-
o efi caz e, mesmo ento, a abstrao pode precisar de alguma converso. A
abstrao pode demorar a amadurecer.
A abstrao pode tomar um componente encapsulado mais reutili zvel, pois ele est personali-
zado para um domino de problemas e no para um uso especfi co. Entretanto, h mais coisas im-
portantes quanto ao encapsulamento do que a simples reut ili zao de componentes. O
encapsulamento tambm importante porocul tar os detalhes internos. O tipo abstrat o de dados
um bom lugar para ver em seguida, na busca do encapsulamento eficaz.
Guardando seus segredos atravs da
ocultao da implementao
A abstrao apenas uma caracterst ica do encapsulamento eficaz. Voc pode escrever cdigo
abstrato que no encapsulado. Em vez di sso, voc tambm precisa ocultar as implementaes
internas de seus objetos.
A ocultao da impl ementao tem duas vantagens:
Ela protege seu objelo de seus usurios.
Ela protege os usurios de seu objeto do prprio objeto.
Vamos explorar a primeira vant agem - proteo do objeto.
Dia 2
Protegendo seu objeto atravs do T AD (Abstract Data
Type - Tipo Abstrato de Dados)
o Tipo Abstrato de Dados (TAD) no um conceito novo. Os TADs,junto com a prpria 00,
cresceu a partir da li nguagem de programao Si mula, introduzida em 1966. Na verdade, os
TADs so decididamente no 00; em vez disso, eles so um subconj unto da 00. Entretanto, os
TADs apresent am duas caracterst icas interessantes: ahstrao e tipo. essa idia de tipo que
importante, pois sem ela, voc no pode ter um verdadeiro encapsulament o.
NOTA
o verdadeiro encapsulamento imposto em nivel de linguagem, atravs de
construes internas da linguagem. Qualquer outra forma de encapsul amento
simplesmente um acordo de cavalheiros, que facilmente malogrado. Os
programadores o contornaro porque podem fazer isso!
Novo TERMO
Um TAD um conj unto de dados e um conjunto de operaes sobre esses dados. Os
T AOs pernlitem que voc defina novos tipos na linguagem, ocultando dados inter-
nos e o estado, atrs de uma interface bem definida. Essa interface apresenta o TAO como uma
uni ca unidade atmi ca.
Os TA Os so uma maneira excelente de introduzi r encapsulament o, pois eles o li beram de con-
siderar o encapsulamento sem a bagagem extra da herana e do polimorfismo: voc pode se con-
centrar no encapsulament o. Os TAOs tambm pennitem que voc explore a noo de tipo. Uma
vez que o tipo seja entendido, fcil ver que a 00 oferece uma maneira nat ural de estendcr uma
linguagem, definindo tipos personali zados do usuri o.
o que um tipo?
Quando programar, voc criar diversas vari veis e atribuir valores para elas. Os ti pos defi nem
as di ferentes espcies de valores que esto disponveis para seus programas. Voc usa tipos para
construir seu programa. Exemplos de alguns tipos comuns so inlegers (inteiros), longs (inteiros
longos) e fl oats (reais). Essas definies de ti po informam exatamente quai s espcies de tipos es-
to disponvei s, o que os ti pos fazem e o que voc pode fazer com eles.
Usaremos a seguinte definio de tipo:
Novo TERMO
Os tipos definem as diferentes espcies de valores que voc pode usar em seus pro-
gramas. Um tipo define o domn io a panir do qual seus valores vlidos podem ser ex-
trados. Para inteiros posit ivos, so os nmeros sem panes fracionarias e que so maiores ou
iguais a O. Para tipos estruturados, a definio mais complexa. Alm do dom inio, a definio de
tipo inclui quais operacs so vlidas no tipo e quais so seus resultados.
NOTA
Encapsulamento: aprenda a manter os detalhes consigo mesmo 31
a t ratamento formal de tipo est fora dos objetivos de um li vro sobre paa para
ini ciantes.
Os ti pos so unidades atmicas da computao. Isso signifi ca que um tipo uma unidade inde-
pendente. Pegue o inteiro, por exemplo. Quando soma dois int eiros, voc no pensa sobre a adi -
o de bits indi viduais; voc pensa apenas a respeito da adio de dois numeroso Mesmo que os
bits representem o inteiro, a linguagem de programao apresenta o inteiro apenas como um n-
mcro para O programador.
Pegue o exemplo Item do Dia I. A criao da classe Itemadiciona um novo tipo em seu vocabul-
rio de programao. Em vez de pensar a respeito de uma id , uma descrio e um preo de produto
como entidades separadas, provavelmente regies desconectadas da memria ou variveis, voc
pensa si mplesmente em termos de I tem. Assim, os tipos permitem representar estruturas comple-
xas em um nvel mais simples e mai s conceituai. Eles o protegem dos detalhes desnecessrios. Isso
o libera para trabalhar no nvel do problema, em vez de trabalhar no nvel da implementao.
Embora seja verdade quc um tipo protege o programador dos detalhes subjacentes, os tipos ofe-
recem uma vantagem ainda mais importame. A definio de um tipo protege o tipo do programa-
dor. Uma defi nio de tipo garante que qualquer objeto que interaja com o tipo, o faa de maneira
correta, consistente e segura. As restries impostas por um tipo impedem os objetos de terem uma
interao inconsistente, possivelmente destrutiva. A delarao de um tipo impede que o tipo seja
usado de maneira no projetada e arbitraria. Uma declarao de tipo garante o uso correio.
Sem uma definio clara das operaes pennitidas, um tipo poderia interagir com outro tipo da
maneira que quisesse. FreqUentemente, tal interao indefi nida pode ser destrutiva.
Pense novamente no Item do Dia I. Imagine que ti vssemos alterado um pouco a definio de
I tem:
public class Unencapsulatedltem {
I
II
public double unft_pri ce ;
public double discount ; !!lITI(I porcentagem de desconto a ser aplicada no preo
publ ic int quantity;
public String description;
publ ic String id;
Voc notar que Iodas as variveis internas agora esto publicamenlc di sponvci s. E se algum
escrevesse o programa a segui r, usando o novo Unencapsul atedItem:
publ i c static void main( String {] args ) {
Unencapsulatedltem moni t or z
new UnencapsulatedItem(
}
Dia 2
"17\" SVGA Monitor ",
1
299 .00 ) ;
monitor .discount 1. 25; II invlido, o desconto deve ser menor que 100%!
double pri ce mon itor.getAdj ustedTot al();
System.out. pr i nt ln( "Incorrect Total: $" + prlce ) ;
monitor.setOlscount{ 1.25 ); II invl ido
I I entretanto, o configurador capturarli o erro
pr i ce monitor.get Ad justedTotal O;
System. out .println{ "Correct Total:$" + price ) ;
A Figura 2.5 mostra o que acontece quando voc execut a o mtodo mainO.
FIGURA 2.5
Um 10/(// illwlido.
Abrindo o tipo Unencapsu 1 a ted I tem para acesso liberado, out ros podem chegar e deixar uma ins-
tncia de Une nca psu 1 ated I t em em um estado invlido. Nesse caso, ma i n () cria um Unencapsu 1 a-
tedltem e, em seguida, aplica diretamente um descont o invlido. O resultado um preo
negati vo ajustado!
Os TADs so ferramentas de encapsul amento valiosas, pois eles permitem que voc defina no-
vos tipos da linguagem que so seguros de usar. Assim como novas palavras so acrescentadas
no idioma ingls a cada ano, um TAD permite que voc cri e novas palavras de programao,
onde voc precisa expressar lima nova idia.
Uma vez defi nido, voc pode usar um novo tipo como qualquer outro. Assim como voc pode
passar um inteiro para um mtodo, tambm pode passar um TAO para um mtodo. Isso conhe-
cido como sendo um objeto de pri meira classe. Voc pode passar objetos de primeira classe
como parmetros.
Encapsulamento: aprenda a manter os detal hes consigo mesmo 33
Novo TERMO
Novo TERMO
Um objelO de primeira c/o.se aquele que pode ser usado cxatamcnte da mesma ma
neira que um tipo interno.
Um objelo de segllnda c/asse um tipo deobjelO que voc pode definir, mas no ne
ccssariarncnte usar, como faria com um tipo interno.
Um exemplo de TAO
Vamos considerar o exemplo da fila abstrata apresentado anteriormente. Ao implementar uma
fila, voc di spe de vrias escolhas de implementao. Voc pode implementar a fila como uma
I ista encadeada, uma li sta duplamente encadeada, um vetor ou uma matriz. Entretanto, a imple
mentao subjacente no muda o comportamento definido da fi la. I ndependentemente da im pIe
mentao, os itens ainda entram e saem de acordo com a ordem FIFO.
A fila uma forte candidata para um TAO. Voc j viu que no precisa conhecer a implementa
o subjacente para usar a fil a. Na verdade, voc no quer ter de se preocupar com a impl emen
tao. Se voc no transformar a fila em Ulll TAO, cada objeto que preci sa de uma fila precisar
rei mplementar a estrutura de dados. Cada objeto que quiser manipular os dados na fi la precisar
entender a implementao e entender como fazer para interagir com ela corretamente. Voc j
viu os perigos do uso no projetado!
Em vez disso, voc deve construi r a fila como um TAO. Um TAD de fi la bem encapsulado ga
rante acesso consistent e e seguro aos dados.
Ao sentarse para projetar um TAO, voc precisa perguntarse o que o TAD faz. Neste caso, o
que voc pode fazer com uma fi la? Voc pode:
Colocar elementos na fil a: enqueue
Remover elementos da fi la: dequeue
Consultar o estado da fi la
Ver o elemento da frente sem remov lo: peek
Cada um dos mtodos se transformar em uma entrada na interface pbl ica de Queue.
Voc tambm preci sa nomeara TAO. Neste caso, o nome do TAO Queue. O TAO definido
como segue:
publi c interface Queue {
I
public voi d enqueue( Object obj );
publ i c Object dequeue();
publ ic boolean i sEmpty();
publ ic Obj ect peek();
Note que a interface da fila no diz nada a respeito de como a fila contm seus dados internos.
Note tambm que a interface no fornece acesso li berado a qualquer dos dados int ernos. Todos
os detalhes fi cam ocultos.
Dia 2
Em vez disso, agora voc tem um novo tipo, uma fila. Agora, voc pode usar esse tipo em qual-
quer um de seus programas.
Como se trata de um objeto de primeira classe, voc pode usara fi la como parmetro. Voc pode
tratar a abstrao como uma unidade, pois todas as partes so independentes. Isso poderoso;
pois permite ao programador ser mai s expressivo. Em vez de pensar em termos de ponteiros e
listas, o programador pode pensar em um nvel muito mais alto: em termos do problema a ser re-
solvido. Quando o programador diz fila, a palavra inclui todos os detalhes de uma lista e de UIll
ponteiro, mas tambm permite que ele ignore esses detalhes e pense em uma estrutura de dados
FIFO de alt o nivel.
Conforme voc ver. medida que continuar. um tipo pOderia ser composto
de outros ti pos. atravs de restries. Embora isso oculte os det athes. t ambm
aumenta sua capacidade de se expressar. Os tipos que contm outros tipos po-
dem abranger muitos conceitos.
Por exemplo, quando voc programa e diz i nt. o signi f icado muito simples;
voc simplesmente declarou um nico inteiro. Entret anto, quando voc diz
Queue, sua declarao muito mais expressiva. H mui t o mais ocorrendo den-
tro de Queue do que dent ro de int.
Vamos considerar a interface mais um pouco. Note que essa interface mui to genrica. Em vez
de di zer que essa uma fil a de inteiros ou hamburgers, a interface simplesmente coloca e reti ra
objetos da fi la. Em Java, voc pode tratar todos os objetos como Objec t . Entretanto, cada lingua-
gem fornece seu prpri o mecanismo semel hante. Declarando os parmetros desse modo, voc
pode colocar qualquer objeto que queira na fila. Assim, essa defi nio torna o tipo Queue ltil em
muitas sit uaes diferentes.
ALERTA
As interfaces genricas tm seus prprios perigos. Uma Queue de inteiros muito
exata. Voc sabe que cada element o em Queue um intei ro. Entret anto, uma
Queue de objetos fracamente tipada. Quando voc extrai um elemento, pode
no saber qual seu t ipo.
Para um encapsulamento realmente efi caz, existem mai s algumas caractersticas que voc preci-
sar tratar. Tocamos no aspecto da ocultao da implementao. Mas, e quant o ao outro lado da
moeda - proteger os usuri os de seus objetos?
Protegendo outros de seus segredos atravs da ocultao
da implementao
At aqui, voc vi u que uma interface pode ocultar a implementao subjacente de um obj eto.
Quando oculta a implementao atrs de uma interface, voc protege seu objeto de uso no pro-
Encapsulamento: aprenda a manter os detalhes consigo mesmo 35
jetado ou destrutivo. Proteger seu objeto de uso no projetado uma vantagem da ocultao da
implementao. Entretanto, existe outro lado na histria: os usuri os de seus objetos.
A ocullao da implementao leva a um projeto mais flex vel , pois ela impede que os usurios
de seus objetos se tomem fortemente acoplados implementao subjacente dos objetos. Ento,
no apenas a ocultao da implementao protege seus objelos, como tambm protege aqueles
que usam seus objetos, esti mul ando um cdigo fracamente acoptado.
Novo TERMO
Novo TERMO
o cdigofracamente acoplado independente da implementao de outros compo-
nentes.
o cdigo fortemel1te acoplado fortemente vinculado implementao de outros
componentes.
Voc poderia estar se perguntando, "para que serve cdigo fracamente acoplado?"
Quando um recurso aparece na interface pblica de um objeto, todo mundo que usa o recurso se
toma dependente do fato de ele existir. Se o recurso desaparecer repenti namente, voc preci sar
alterar o cdigo quc tiver se desenvolvido de forma dependente a esse comportamento ou atri buto.
Novo TERMO
Cdigo dependeme dependente da existncia de detcnninado tipo. O cdigo de-
pendente inevitvel. Entretanto, existem graus para a dependncia aceitvel e para
a superdependncia.
Existem graus para a dependncia. Voc no pode eliminar a dependncia total mente. Ent retan-
to, voc deve se esforar para minimizar a dependncia entre objetos. Nonnahnente, voc limita
tal dependncia programando uma interface bem defi nida. Os usurios s6 podem se tomar de-
pendentes quanto ao que voc decide colocar na interface. Entretant o, se alguma implementao
do objeto se tornar partc da interface, os usurios do objelo podero se tornar dependentes dessa
implementao. Tal cdigo fortemente acoplado el imina sua li berdade de alterar a
o de seu objcto. Uma pequena alterao na i mplementao de seu objcto poderia necessitar de
uma cascata de alteraes por todos os usurios do objeto.
o encapsulamento e a ocultao da implementao no so mgica. Se voc
precisar alterar uma interf ace, precisar atualizar o cdigo que dependente
da interface antiga. Ocul t ando os detalhes e escrevendo software para uma in-
terface, voc cria software que fracamente acoplado.
o cdigo fonemente acoplado anula o objetivo do encapsulamento: criarobjelos independentes
e reutilizveis.
Dia 2
Um exemplo real de ocultao da implementao
Um exemplo concreto de ocultao da implementao esclarecer esta lio. Considere a se-
guinte definio de classe:
publlc cl ass Customer {
}
II ... vrios mtodos de
publlc I tem (} items;
cliente
Ileste
array contm t odos os itens selecionados
Um Customer contm itens selecionados. Aqui, Customer torna o array I tem parte de sua interfa-
ce externa:
publ1c static void main( String [] args ) {
Customer customer new Customer {) ;
}
II . . . seleciona alguns itens .. .
II preo dos itens
double total 0.0;
for( lnt 1 O; 1 < customer.items.length; i++) {
Item i tem customer.items[i] ;
total total + item.getAdjus tedTotal();
}
Esse mtodo main() pega um cliente, adiciona alguns itens e totaliza o pedido. Tudo funciona,
mas o que acontece se voc quiser mudar a maneira corno um Customer cont m itens? Suponha
que voc quisesse introduzi r uma classe Bas ket. Se voc mudar a implementao, precisar at u-
alizar todo o cdigo que acessa diretamente o array Item.
Sem ocult ao da implementao, voc perde sua liberdade de melhorar seus objetos. No exemplo
Cus temer, voc deve tomar o array I tem privado. Fornea acesso aos itens atravs de acessores.
NeTA
A ocultao da implementao tem seus inconvenientes. Exi stem ocasies em
que voc poderia precisar saber um pouco mais do que a interface pode infor-
mar.
No mundo da programao, voc desejar uma caixa preta que funcione den-
tro de det erminada tolerncia ou que use a quantidade certa de preciso. Voc
poderia saber que precisa de inteiros de 64 bits, pois est t ratando com nme-
ros mui to grandes. Ao definir sua interface, importante no apenas fornecer
uma interface, mas tambm documentar esses tipos de detalhes especificas
sobre a implementao. Entretanto, assim como em qualquer outra parte da
interface pblica, uma vez que voc declara um comportamento, no pode ai-
terlo.
Encapsulamento: aprenda a manter os detal hes consigo mesmo 37
A ocuhao da implementao permite que voc escreva cdigo que independente e fracamen-
te acoplado com outros componentes. O cdigo fracament e acoplado menos frgil e mais flex-
vel para alterar. Um cdigo flexivel facil ita a reuti lizao e o aprimoramento, pois as alteraes
em uma part e do sistema no afetar out ras partes no relacionadas.
DI CA
Como voc obtm ocultao da implementao eficaz e cdigo fracamente
acoplad07
Aqui esto algumas dicas:
S permita acesso ao seu TAO atravs de uma interface baseada em mto-
do. Tal interface garante que voc no exponha informaes sobre a im-
plementao.
o No fornea acesso involuntrio a estruturas de dados internas, retornan-
do pontei ros ou referncias acidentalmente. Aps al gum obter uma refe-
rncia, a pessoa pode fazer tudo com ela.
o Nunca faa suposies sobre os outros tipos que voc usa. A no ser que
um comport amento aparea na interface ou na documentao, no conte
com ele.
o Cuidado enquanto escrever dois tipos intimamente relacionados. No
programe acidentalmente em supOSies e dependncias.
Diviso da responsabilidade: preocupando-se
, . , .
com seu propno negocIo
A ocultao da implementao evol ui naturalmente para uma discusso sobre a diviso da res-
ponsabilidade. Na seo ant erior, voc viu como poderi a desacoplar cdigo ocultando detalhes
da implementao. A ocultao da implementao apenas um passo na direo da escrita de
cdigo fracamente acoplado.
Para ter realmenle cdigo fracamente acoplado, voc tambm deve ter uma di viso da responsa-
bilidade correta. Di viso da responsabilidade correta signifi ca que cada objeto deve executar
uma funo - sua responsabilidade - e execut- la bem. A diviso da responsabilidade correta
tambm significa que o objeto coesivo. Em outras palavras, no faz sent ido encapsul ar muitas
funes aleatrias e variveis. Elas precisam ter um forte vinculo conceituaI entre si. Todas as
funes devem trabalhar no senti do de uma responsabil idade comum.
NOTA
Dia 2
A ocultao da implementao e a responsabilidade andam lado a lado. Sem
ocultao da implementao, a responsabi lidade pode faltar em um objet o.
de responsabil idade do objeto saber como fazer seu trabalho. Se voc deixar a
impl ementao aberta para o mundo exteri or. um usuri o poder comear a
atuar diretamente na implementao - dupl icando assim a responsabi l idade.
Assim que dois objetos comeam a fazer a mesma tarefa, voc sabe que no
t em uma diviso da responsabilidade correta. Quando voc observar a exis-
t ncia de lgica redundante, precisar refazer seu cdigo. Mas no se sinta
mal; refazer o t rabalho uma part e esperada do ciclo de desenvolvimento 00.
A medida que seus projetos amadurecerem, voc encontrar muit as oportuni-
dades para melhor-los.
Vamos considerar um exemplo real de diviso da responsabi lidades: o relacionamento entre ge-
rent e e programador.
Imagine que seu gerente venha at voc, fornea as especificaes de sua parle em um projeto e,
em seguida, o deixe trabalhar. Ele sabe que voc tem um trabalho a fazer e que sabe como razero
melhor trabalho possvel.
Agora, imagine que seu chefe no to esperto. Ele explica o projeto e pelo que voc ser res-
ponsvel. Ele lhe garante que est l para facilitar seu trabal ho. Mas, quando voc comea, ele
puxa uma cadeira! Pelo resto do dia, seu chefe fica em cima de voc e fornece instrues passo a
passo, enquant o voc codifica.
Embora o exemplo seja um tani a extremo, os programadores programam dessa maneira em seu
cdigo, o tempo todo. O encapsulament o como o gerente efi ciente. Como no mundo real, co-
nhecimento e responsabi lidade precisam ser delegados para aqueles que sabem como fazer o tra-
balho da melhor ronna possvel. Muitos programadores estrut uram seu cdigo como um chefe
autoritrio trata seus funcionrios. Esse exemplo fac ilmente transportado para os termos da
programao. Vamos considerar um exemplo assi m:
public class Badltem {
private double unit _pricei
private double adjusted_pr1ce i
private double discounti
II
uma porcentagem
II
preo
private i nt quantitYi
private String descriptioni
pri vate St ring i d i
publ ic Badltem( St ring id o String descri ption,
int quantity. doubl e pri ce ) {
this . id 1d i
this.descriptlon descriptioni
i l( quantity >- O ) {
de desconto para aplicar no
}
Encapsulamento: aprenda a manter os detalhes consigo mesmo 39
this.quantity quantity;
}
else {
this.quantity O;
}
this.unit_price z price;
}
public double getUnitPrice() {
return unit_price;
}
II aplica uma porcentagem de desconto no preo
public void setOiscount( double discount ) (
if( discount <- 1. 00 ) {
this.discount : discount ;
}
}
publiC double getOiscount() I
return discount;
}
publiC int getQuantity() (
return quantity;
)
public void setQuantity( int quantity ) {
thi s.quantity - quantity ;
}
publiC String getProductID() I
return id;
}
public String getDescription() {
return description;
}
publ i C double getAdjustedPrice() {
return adjusted_price ;
}
publ iC voi d setAdjustedPrice( double pr ice) I
adjusted_price price;
}
Dia 2
BadItem no cont m mais a responsabilidade de calcular o preo ajustado. Ento, como voc
gera um preo ajustado? Considere o mtodo mainO a seguir:
public static voi d ma i n( String [] args ) I
I
II cr i a os itens
BadItem milk = new BadItem( "1 Gallon Milk
R
, 2, 2.50 );
II apl ica cupons
milk. set Oi scount( 0.15 ) ;
II obtm os preos ajus tados
double milk_price milk.getQuantity() * milk.getUnitPrice() ;
double milk_discount = milk.getDiscount() * milk_price ;
milk.setAdjustedPrice( milk_price - milk_discount );
System. out.println( "Your milk costs : \t $" + milk.getAdj us tedPriceO )i
Agora, em vez de si mplesmente solici tar a Item seu preo ajustado, voc precisa se comportar
como o gerente ineficiente. Voc preci sa dizer ao objeto item o que fazer, passo a passo.
Ter de chamar varias funes para calcular o total ajustado, retira a responsabilidade do item e a
coloca nas mos do usurio. Reti rar a responsabil idade dessa maneira to rui m quanto expor
implementaes internas. Voc acaba com responsabil idade duplicada por todo o seu cdigo.
Cada objeto que desejar calcular o total aj ustado precisar repeti r a lgica encontrada no mtodo
ma ioO.
Ao escrever suas interfaces, voc preci sa certificar-se de que no esteja si mplesment e apresen-
tando a implementao atravs de um conjunto de nomes diferente. Lembre da fila - voc no
quer mtodos chamados addObjec tToLi s tO, updateEndl i stPoi nterO etc. Esses tipos de com-
portamentos so especficos da implementao. Em vez disso. voc ocul ta a implementao,
atravs dos comport amentos enqueueO e dequeueO. de n vel mais alto ( mesmo que, interna-
mente, voc possa atuali zar ponteiros c adicionar o objeto a uma li sta). Em te rmos de BadI tem,
voc no desejar ter de chamar um mtodo ca 1 culateAdjustedPri ce O, antes de poder recupe-
rar o preo aj ustado atravs do mtodo getAdjustedPri ce (). Em vez disso, getAdjustedPri ce ()
deve saber efetuar o clculo.
Quando voc tem objetos que no dividem corretamente a responsabil idade, acaba com cdigo
procedural , centrado nos dados. O mtodo mai n para calcular o preo aj ustado mui to procedu-
ral o Um mtodo maio que instrusse um obj eto Queue em cada passo de seu processo enqueue()
seria procedural. Se voc simplesmente enviar uma mensagem para um objeto e confiar que ele
faa seu trabalho, esse o verdadeiro desenvolvimento orientado a objetos.
O encapsulamento esta completamente ligado ocultao de detal hes. A responsabilidade colo-
ca o conhecimento de certos detalhes onde eles pertencem. importante que os objetos tenham
apenas uma ou um pequeno numero de responsabilidades. Se um objeto tiver responsabili dades
Encapsulamento: aprenda a manter os detal hes consigo mesmo 41
demais, sua implementao se tomar mui to confusa e dificil de manter e estender. Para alterar
uma responsabil idade, voc correr o risco de alterar out ro comportamento inadvertidament e, se
um objeto conti ver muitos comportamentos. Ele tambm central izar muito conhecimento, que
estari a melhor espalhado. Quando um objeto fica grande demais, ele quase se toma um progra-
ma completo e cai nas armadi lhas procedurais. Como resultado, voc se depara com todos os
problemas que encontraria em um programa que no usasse nenhum encapsulamento.
Quando voc verifi car que um objeto executa mai s de uma responsabi lidade, precisar mover
essa responsabilidade para seu prprio obj eto.
A LERTA
A ocultao da implementao apenas um passo para o encapsulamento efi -
ciente. Sem divises de responsabi l idade corretas, voc simplesmente acaba
com uma li sta de procedimentos.
Neste ponto, voc pode melhorar a definio de encapsulamento.
NovO TERMO
Encapsulamel1to efelil'o abstrao mais ocultao da implementao mais res-
ponsabilidade.
Retire a abstrao e voc ter um cdigo que no reutilizvel. Reti re a ocultao da implementa-
o e voc fi car com um cdigo fortemente acopladoe frgil. Retire a responsabilidade e voc fi-
car com um cdigo centrado nos dados, procedural, rortemente acoplado e descentrali zado.
Sem todas as trs partes, voc no pode ter um encapsulamento efet ivo, mas a falta de responsa-
bilidade o deixa com a pior situao de todas: programao procedural em um ambiente ori enta-
do a objetos.
Dicas e armad do encapsulamento
Ao se aplicar encapsulamerHo, existem vrias di cas a seguir e armadilhas a evit ar.
Dicas e armadilhas da abstrao
Ao escrever uma classe, voc pode ter problemas, se tentar trabalhar de forma abstrata demais.
impossvel escrever lima classe que satisfaa todos os usurios e cada situao. Imagine que
voc ti vesse de escrever um objeto pessoa para um sistema de folha de pagamento de uma em-
presa. Esse objeto pessoa vai ser muito diferente de um objelo pessoa no simulador de nuxo de
trfego que discutimos anteriormente.
Dia 2
A abstrao pode ser perigosa. Mesmo que voc t enha abstraldo algum el e-
mento, ele poder no funci onar em todos os casos. mui to difcil escrever
uma classe que sat isfaa as necessidades de todos os usuri os. No caia na fi -
xao da abstrao - resolva seus problemas primeirol
Tudo se resume a fazer o sufi cienle para resolver o problema imediato. Inclui r todos os detalhes
necessrios para o objeto pessoa funcionar nos dois contextos seria muito dispendioso. Isso pode
provocar lodos os problemas que voc viu hoje, devido responsabil idade embaralhada. Embo-
ra voc possa ligar seu objeto pessoa s duas situaes, ele no ser mais um objeto pessoa abs-
trato. Voc perde toda a simplificao que a abstrao oferece.
ALERTA
No coloque em uma classe mais do que o necessri o para resol ver o proble-
ma. No tente resol ver todos os probl emas; resol va o problema imediato. So-
mente ento voc dever procurar meios de abstrair o que fez .
E claro que existem ocasies onde um problema complexo, como um clcul o dificil ou uma si-
mulao complicada. Estamos falando de complexidade do ponto de vista da responsabi lidade.
Quanto mais responsabilidades um objeto assume, mais complexo ele ser e mais dificil ser
mant-lo.
DICA
Lembre-se de que adicionar uma nova classe em seu si st ema o mesmo que
cri ar um novo tipo. Ter essa noo em mente ajuda a f ocalizar o que voc est
realmente f azendo. Ao falar sobre seu probl ema, voc ver que estar falando
em termos dos obj etos e das interaes e no de dados e mtodos.
Finalmente, a verdadeira abstrao s pode vir com o tempo.
A verdadeira abstrao normalmente nasce a part ir de usos reais c no do fato de um programa-
dor se sent ar e decidi r criar um obj elo reuti lizvel. Como diz o ditado, a necessidade a me da
inveno. Os objetos funcionam da mesma maneira. Normalmente, voc no pode sentar-se e
escrever um objeto abstraIO realmente reutilizvel, logo na primeira vez. Em vez disso, os obje-
tos reutilizveis nonnalmente so derivados de um cdigo amadurecido, que foi posto prova e
que enfrentou muitas alteraes.
A verdadeira abslrao tambm vem com a experincia. E um objeli vo a ser buscado no dom nio
da POO.
Encapsulamento: aprenda a manter os detal hes consigo mesmo 43
Dicas e armadilhas do TAO
A transformao de um TAD em uma classe especifica da linguagem. Entretanto, existem al-
gumas consideraes independentes da li nguagem que voc pode fazer a respeito das classes.
A maioria das linguagens 00 fomece palavras-chave que o aj udam a defi nir classes encapsula-
das. Primeiro, existe a prpria defin io de classe. A classe como o TAD, mas com alguns re-
cursos import antes, que voc vcr nos prximos dias.
Dentro de uma classe, normalmente voc tem mtodos e varivei s internas-os dados. O acesso
a essas variveis e mtodos fomecido por funes de acesso. Tudo na interface do TAD deve
parecer fazer parte da interface pblica do obj eto.
Os TADs no so diretament e anlogos classe da 00. El es no tm herana
e recursos de pOlimorfismo. A importncia desses recursos se t ornar eviden-
te quando voc estudar o Dia 4 e o Dia 6, aprendendo a prever
o
Dicas da ocultao da implementao
o que expor e o que ocultar em sua interface nem sempre fcil de decidir. Entretanto, podemos te-
cer algumas consideraes independentes da linguagem sobre o acesso. Apenas os mtodos que
voc pretende que outros usem devem estar na interface pblica. Os mtodos que apenas o tipo usar
devem estar ocul tos. No exemplo da fi la, dequeue () e enqueue() devem estar na interface pbl ica.
Entretanto, voc deve ocultar mtodos auxil iares, como updateFrontPointerO e addToListO.
Voc sempre deve ocultar as variveis internas, a no ser que elas sejam constantes. Achamos
que elas no devem estar apenas ocultas, mas tambm acessveis apenas para a prpria classe.
Voc vai expl orar esse conceito mais detidamente, no Dia 4. Abrir varivei s internas para acesso
externo expe sua implement ao.
NeTA
Voc pode abrir variveis internas para uso externo apenas se sua linguagem
tratar desses valores como trata mtodos. O Delphi e o Borland C++ tratam de
variveis i nternas dessa maneira.
Se usurios externos puderem acessar mtodos e valores sem saber que esto
mexendo em um valor, ento estar correto abri los. Em t al linguagem, uma
vari vel interna exposta seria igual a um mtodo que no recebe parmetros.
Infelizment e, no so muitas li nguagens 00 que Iratam valores e mt odos da
mesma maneira.
finalmente, no crie interfaces que apresentam apenas a representao interna com um nome di -
ferente. A interface deve apresentar comportamentos de alto n vel.
Dia 2
Como o encapsulamento atende os objetivos da
programao orientada a objetos
o Dia I mostrou que o objetivo da programao ori entada a objetos produzir software:
I. Natural
2. Confivel
3. Reuti lizvel
4. Manutenivel
5. Extensvel
6. Oportuno
o encapsulamento atende cada um desses objetivos:
Natural: o encapsulament o permite que voc divida a responsabil idade da manei ra como
as pessoas pensam naturalment e. Atravs da abstrao, voc fica li vre para modelar o
problema em termos do prprio problema e no em termos de alguma implementao es-
pecfica. A abstrao permite que voc pense e programe no geral.
Confivel: isolando a responsabilidade e ocultando a implementao. voc pode validar
cada componente individual. Quando um component e for vali dado, voc poder us- lo
com confiana. Isso possi bili ta testes de unidade completos. Voc ai nda precisa realizar
testes de integrao, para cert ifi car-se de que o software construdo funciona corretamente.
Reutil izvel: a abstrao fornece cdigo flexvel e utili zvel em mais de uma situao.
Manuten vel: o cdigo encapsulado mais fcil de manter. Voc pode fazer qualquer al -
terao que queira na implementao de uma classe, sem danificar cdigo dependente.
Essas alteraes podem incluir mudanas na implementao, assim como a adi o de no-
vos mtodos na interface. Apenas as alteraes que violam a sernmica da interface exigi-
ro mudanas no cdigo dependente.
Extensivel: voc pode mudar implementaes sem danificar cdigo. Como resultado, voc
pode fazer melhorias de desempenho e mudar funcionalidade sem dani fi car o cdigo exis-
tente. Alm di sso, como a implementao fica oculta, o cdigo que usar o componente ser:l
atualizado automaticamente, para tirar proveito de todos os novos recursos que voc intro-
duzir. Se voc fi zer tais alt eraes, certifique-se de fazer os testes de unidade novamente!
Danificar um objeto pode ter um efeito de domin por todo o cdigo que use o objeto.
Oportuno: dividindo seu sofuvare em partes independentes, voc pode dividi r a tarefa de
criar as partes ent re vrios desenvolvedores, acelerando assim o desenvolvi mento.
Uma vez que esses componentes estejam construidos e validados, eles no precisaro ser recons-
truidos. Assim, o programador fica livre para reutil izar funcionalidade, sem ter de recri -Ia.
Encapsulamento: aprenda a manter os detal hes consigo mesmo 45
Advertncias
Voc pode estar pensando, "mas eu no preciso de 00 para abstrair e encapsular meu cdigo".
Quer saber? Voc est certo - voc no precisa de 00 para ter cdigo encapsulado. Os prprios
TADs no so 00. E bastante possvel ter encapsulamento em praticamente qualquer li nguagem.
Entretanto, h um problema. Em outros tipos de li nguagens, voc freqentemente precisa criar
seus prprios mecanismos de encapsulamento. Como no existe nada na linguagem que o obrigue
a respeitar seus padres, voc precisa estar atento. Voc precisa se obrigar a seguir suas diretrizes.
Voc tambm ter de recriar suas diret rizes e seu mecani smo para cada programa que escrever.
Isso est bem para um desenvolvedor. Mas e para dois desenvolvedores? Dez? Uma empresa in-
teira? Quanto mais desenvolvedores so adicionados, mais di fici l ter todos na mesma pgina.
Uma verdadeira linguagem 00 fornece um mecanismo para encapsulamento. Ela impe o meca-
nismo de um modo que voc no consegui ria sozinho. A li nguagem encapsula os detalhes do me-
canismo de encapsulamento do usurio. Uma linguagem 00 fornece algumas palavras-chave. O
programador simplesmente usa as palavras-chave e a linguagem cuida de todos os detalhes.
Ao trabalhar com os recursos fornecidos pela linguagem, a linguagem apresenta a todos os pro-
gramadores o mesmo mecanismo consistent e.
Resumo
Agora que voc entende de encapsulamento, pode comear a programar com objetos. Usando
encapsulamento, voc pode tirar proveito das vantagens da abstrao, da ocultao da imple-
mentao e da responsabilidade em seu cdigo dirio.
Com a abstrao, voc pode escrever objetos que so tei s em vrias situaes. Se voc ocultar
corretamente a implementao de seu objeto, estar livre para fazer quaisquer mel horias que
queira em seu cdigo - a qualquer momento. Finalmente, se voc dividir corretamente a res-
ponsabilidade entre seus objetos, evi tar lgica duplicada e cdigo procedural.
Se voc fec har este li vro agora e nunca mais consult-lo, ter aprendido novas habil idades de
0 0 sufi cientes para escrever componentes independentes. Entretant o, a histria da 00 no ter-
mina com o encapsulamento. Cont inue a ler e voc aprender como tirar proveito de todos os re-
cursos oferecidos pela POO.
Perguntas e respostas
P Como \' oc sabe quais mClodos dcvc incluir em uma inlerface?
,
R E si mples saber quais mtodos deve incl uir. Voc precisa incluir apenas os mtodos
que tornam o objeto ti l; os mtodos de que voc precisa para que outro objeto faa seu
trabalho.
Dia 2
Quando voc comear a escrever uma interface, desejar produzi r a menor interface que
ai nda satisfaa suas necessidades. Tome sua int erface o mais si mples possvel. No in-
cl ua mtodos que voc ' poderia' precisar. Voc pode adi cion-los quando realmente
precisar deles.
Conhea certos ti pos de mtodos de convenincia. Se voc fizer um obj eto conter outros
objetos, normal meme desejar evitar a criao de mtodos que si mplesmeme encami-
nham uma chamada de mtodo para um dos objetos conti dos.
Por exempl o, digamos que voc tenha um objeto carrinho de compras que contenha
itens. Voc no deve adicionar um mtodo de convenincia no carrinho, que consultar
um item para saber seu preo e retom-lo. Em vez disso, voc deve ter um mtodo que
permi ta obter o item. Quando voc tiver o it em, poder solici tar o preo em si.
P Voc mencionou as palavras-chave publ i c, protected e private. Existem outros mo-
dificadores de acesso?
R Cada linguagem define seus modificadores de acesso de sua prpria maneira. Entretanto,
a maioria das linguagens 00 define esses trs nveis. A linguagem Java tambm tem um
modificador de acesso do pacote padro. Voc especifica esse nvel omi tindo um modifi-
cador. Esse nvel restringe o acesso a apenas as classes do mesmo pacote. I)ara mais in-
formaes sobre pacotes, consulte o Apndice Bt "Resumo do Java".
P Os modificadores de acesso tambm tm o papel de mecanismo de segurana?
R No. Os modificadores de acesso s restringem o modo como OUl ros objelos podem inte-
ragir com detenninado objeto. Os modificadores no tm nada a ver com a segurana do
computador.
Workshop
As perguntas e respostas do teste so fornecidas para seu melhor entendimento. Veja as respos-
tas no Apndice A, ' Respostas".
Teste
I. Como o encapsulamento at inge os objetivos da programao orientada a objetos?
2. Defina abstrao e d um exemplo demonstrando abstrao.
3. Defi na implement ao.
4. Defina interface.
5. Descreva a diferena ent re interface e implementao.
6. Por que a diviso clara da responsabil idade importante para o encapsulamento eficaz?
Encapsulamento: aprenda a manter os detal hes consigo mesmo 47
7. Defina tipo.
8. Defina TAO (Tipo Abstrato de Dados).
9. Como voc obtm ocultao da implementao efi caz e cdigo fracamente
acoplado?
10. Quais so alguns dos perigos inerent es abstrao?
Exerccios
,
I. Considere a est rutura de dados de pilha clssica. Urna pilha uma estrutura ,. Ult imo a
entrar, pri mei ro a sair" (LI FO). Ao contrrio de urna fi la FI FO, voc s pode ad icionar e
remover elementos a parti r da mesma extremidade de uma pilha. Assim como em uma
fila, urna pilha permite que voc verifique se e la est vazia e escolha o prime iro elemento
que pode remover.
Defi na um TAO para a classe pilha.
2. Pegue o TAO de pil ha do Exercicio I e esboce uma implementao. Quando terminar,
defina uma segunda implementao.
3. Examine os exercicios I e 2. A interface que voc projetou no Exerccio I era adequada
para as duas implementaes formuladas no Exercicio 2? Se ass im foi, quai s vantagens a
int erface forneceu? Caso contrrio, o que faltou na interface ori ginal?
SEMANA 1
DIA
Encapsulamento: hora de escrever
algum cdigo
Ontem, voc aprendeu tudo sobre encapsulamento. Ao iniciar as lies de hoje, voc dever ter
uma boa idia do que encapsulamento, como aplic-lo efi cazment e e em quais erros comuns
,
deve prestar ateno. Neste ponto, o que voc no tem experincia prti ca COlU a tcnica. E cla-
ro que voc conhece a Icoria, mas nada melhor do que se aprofundar no cdigo. Para o restante
do dia, voc completar vrios laboratrios que devero cimentar as lies do Dia 2.
Hoje voc aprender:
Como confi gurar o ambiente Java
Sobre as classes bsicas
Como implement ar o encapsulamento
A respeito do pacote de pri mi tivas Java
laboratrio 1: configurando o ambiente Java
Voc usar a linguagem de programao Java para completar todos os laboratrios desta se
mana, assi m como o projeto fi nal. Para programar em Java, voc precisa obter uma verso do
Java 2. Para completar estes laboratri os, voc precisa ter pelo menos a verso 1.2 do SDK.
Dia 3
Se voc ainda no tem, ter de fazer download e instalar um kit de desenvolviment o agora. Exis-
tem muitos kits de desenvolvimento diferentes disponveis. Ent retanto, voc pode obter facil-
mente a verso mai s recente, a parti r do endereo http: //www.javasoft. com/ j2se/ .
A Sun suporta trs platafonnas pri ncipais: Solari s, Linux e Wi ndows. Quando este livro estava
sendo produzido, a verso mais recente da Sun era Java 2 SOK, Standard Edi tion, v 1.3.
A IBM tambm oferece vri os ki ts de desenvolvimento, no endereo
http://www.i bm.com/java/jdk/index.html.
Alm das plataformas suportadas pela Sun, a IBM tambm fornece suporte a vrias plataformas,
como OS/2, AS/400 e AIX.
Cada kit de desenvolviment o vem com instrues de instalao adequadas. Siga essas instrues
para instalar o kit em sua mqui na de desenvolvimento. Voc tambm pode consultar o Apndi-
ce B, " Resumo do Java", para obter mai s ajuda.
Voc tambm pode optar por usar um popular IDE Java , como Fort e, JBuilderoll Visual Age for
Java. Estes exemplos e laboratrios tambm funci onaro nesses ambientes.
Este livro pressupe uma famil iaridade bsica com programao, mas voc no precisa de um
conhecimento profundo de Java para completar estes laboratrios. Se voc precisar de alguma
ajuda para conhe<::er os fundamentos da linguagem Java, consulte o Apndice B.
Exposio do problema
Na verdade, voc precisa do boi antes do carro. Ant es de poder programar, voc precisa obter e
configurar um ambiente de desenvolvimento Java. Se voc ai nda no fez isso, obtenha um kit de
desenvolvi mento Java e siga os passos de li neados no Apndice B para installo. Uma vez insta-
lado, o apndice o conduzi r na configurao do caminho das classes, ass im como na compila-
o e execuo de seu primeiro programa Java. Quando voc concluir este labof'cl trio, saber se
sua instalao de Java funciona. Voc tambm saber tudo que precisa para compilar e executar
seus programas Java.
laboratrio 2: classes bsicas
muito importante que voc se recorde das lies dos dias 1 e 2, enquanto escreve suas primei-
ras classes.
No Dia I, voc aprendeu alguns fundamentos sobre classes e objetos. O Dia 2 mostrou como
voc podc se benefi ciar do encapsulamento para produzir objetos bem definidos.
A bibli oteca de classes Java contm um rico conjunto de estruturas de dados clssicas, como lis-
tas e tabelas hashi ng. Considere a classe OoubleKey da Listagem 3.1.
Encapsulamento: hora de escrever algum cdigo
LI STAGEM 3.1 OoubleKey.java
public class OoubleKey {
I
private String keyl , key2:
II um construtor sem argumentos
public DoubleKeyD (
keyl "keyl ";
key2 "key2":
I
II um construtor com argumentos
public DoubleKey( String keyl , Str ing key2 ) {
this.keyl keyl:
this.key2 key2;
I
II acessor
publ ic String getKeylO (
return keyl :
I
II mutante
public void setKeyl( St r ing keyl ) {
thi s . keyl keyl :
I
II acessor
public String getKey2() {
return key2 :
I
II mu tante
public void setKey2( St ring key2 ) {
this.key2 = key2:
I
II igual e cdigo hashi ng omitidos por brevidade
51
Quando coloca um objeto em qualquer implementao de java .ut; 1 .Map. voc pode especificar
qualquer objeto como chave para esse objeto. Quando precisa recuperar um objeto, voc sim-
plesmente usa a chave para recuperar o valor. Ooubl eKey permite que voc use hashing em duas
chaves Stri ng, em vez de em uma.
Dia 3
Voc notar que Ooubl eKey tem dois construt ores:
public OoubleKey() I
keyl "keyl-j
key2 "key2
M
;
J
public OoubleKey( String keyl . String key2 ) {
this.keyl = keyl;
this . key2 key2 i
J
Os construtores aparecem em duas formas: aqueles sem argumentos (construtores lI oargs) e
aqueles com argumentos.
Novo TERMO Conslr Ufores l10args so construtores que no recebem nenhum argumento.
NOTA
Construtor noarg um termo Java. O equi valente em C++ construtorpedro.
Os construtores sem argumento instanciam um objeto COm valor padro. enquanto aqueles que
aceitam argumentos usam os argumentos para inicializar o estado interno dos obj etos.
pub 1 i c Ooub 1 eKey () um exemplo de construtor noarg. enquanto pub 1 i c Ooub 1 eKey ( S tri ng
keyl. String key2 ) aceita argumentos.
Confonne o Dia 1 ensinou, mtodos como public St ring getKeyl O e publ ic Stri ng get Key20
so conhecidos como acessorcs, pois eles pcnnitem que voc acesse os valores internos do objeto.
O mundo Java reconhece doi s tipos de acessores: de configurao e de obten-
o. Os de configurao permitem que voc confi gure uma varivel de instn-
cia. enquanto os de obteno permitem que voc leia uma varivel de
instncia.
A Sun Mi crosyst ems desenvolveu uma conveno de atribuio de nomes em
torno de acessores de configurao e de obt eno, conheci da como JavaBean
Design Patterns. JavaBeans uma maneira padronizada de escrever seus
componentes. Se seus componentes obedecem a esse padro, voc pode co-
nect-Ias em qualquer IDE compatvel com JavaBean. Tal IDE poderia permitir
a construo visual de seus programas, usando os beans.
As convenes de atribuio Java so simples. A conveno JavaBean para
atribuio de nomes para acessores de obt eno e de configurao :
public void set<VariableNome>( <type> value )
publ1c <type> get<VariableName>()
onde <type> o tipo da varivel de instncia e <VariableName> o nome da
vari vel de inst ncia.
Encapsulamento: hora de escrever algum cdigo 53
Tome como exemplo um objeto Pessoa. Um objeto Pessoa tem um nome. Os
acessores de obteno e de configurao do nome poderiam ter o segui nt e
formato:
pub l ic void setName( String name )
publi c String getName()
Finalmente, voc chama mtodos como publ ic void setKeyl ( String keyl ) e publ ic void
setKey2( String key2 ) de mutantes, pois eles permitem alterar o estado interno do objeto.
Doub1 eKey demonstra o uso correto do encapsulament o. Empregando uma interface bem defini-
da, DoubleKey oculta sua implementao do mundo exteri or. Doubl eKey tambm bastante abs-
trata. Voc pode reutili zar Doubl eKey onde precisar usar hashing com duas chaves String.
Finalment e, Doubl eKey di vide corretam ente a responsabilidade, fornecendo apenas os mtodos
necessri os para atuar como uma chave.
Exposio do problema
No Di a 2, voc viu um Banco 00. No Banco 00, os clientes entram em uma fi la, enquanto es-
peram por um caixa. Mas no se preocupe, voc no vai escrever uma classe Queue. A linguagem
Java tem bastante suporte interno para estruturas de dados clssicas. Em vez disso, voc vai pro-
gramar uma classe de conta - a li nguagem Java ainda deixa o programador com alguns traba-
lhos a fazer.
Sej a essa uma conta corrente, uma conta poupana ou uma conta de mercado financeiro, todas
elas tm algumas caracteristicas compartilhadas. Todas as cont as tm um saldo. Uma cont a tam-
bm permitir que voc depos ite valores, saque valores e consulte o saldo.
Hoje, voc vai escrever uma classe de cont a. O Laboratrio 2 vem completo, com uma classe
Te11 er. A classe Te 11 er tem um mtodo ma in () que voc usar para testar a impl ementao de
sua conta.
A classe l eller espera uma interface pblica especfica. Aqui esto as regras:
Voc deve chamar a classe conta de Account.
A classe deve ter os dois construtores a seguir:
pub 1 i c Account ()
pub1; c Aceount( double in Hial_deposH )
O construtor noargs configurar o saldo inicial como 0.00. O segundo construt orconfigu-
rar o saldo inicial como i nitlal_deposit .
A classe deve ter os trs mtodos a seguir. O pri mei ro mtodo credita na conta o valor de
funds:
publlc vo"id depositFunds( double funds )
O mtodo seguinte debita na conta o valor de funds:
Dia 3
publ ic doubl e withdrawFunds( doubl e funds )
Entretanto, wi thdrawFunds () no deve permiti r um saque a descoberto. Em vez disso, se
funds for maior que o saldo, apenas debita o resto do saldo. wi thdrawFunds() deve retor-
nar a real quant idade sacada da conta.
O terceiro mtodo recupera o saldo corrente da conta:
pu bll c double ge tBalanee ()
Alm dessas regras, voc pode adicionar quaisquer outros mtodos que possa considerar tei s.
Entretanto, certifique-se de implementar cada um dos mtodos exatamente como listado an-
teriorment e. Caso contrrio, o caixa no poder fazer seu trabalho!
Uma vez que voc lenha terminado de escrever a classe Aceount , certifique-se de compi lar as
classes Account e Te 11 er. Uma vez fei to isso, execute o ma i n de Te 11 er, digitando ja '.Ia Te 11 er.
Se voc fez seu trabalho corretam ente, dever ver a sada ilustrada na Figura 3.1.
FIGURA 3 .1
A M/ida correia
de rel/er.
A prxima seo di scuti r as solues do Laboratrio 2. No prossiga at con-
cluir o Laboratri o 21
Solues e discusso
A Li stagem 3.2 apresenta uma possvel implementao de Account.
Encapsul amento: hora de escrever algum cdigo
LISTAGEM 3.2 Account .java
public class Account {
I
II dados privados
private double balancei
II const rutor
public Account( double init_deposit ) {
balance init_depos iti
I
publi C Account() {
II n!o precisa fazer nada. balance ter O como padro
I
II deposita dinheiro na conta
publ ic void deposltFunds( double amount ) {
balance balance + amount ;
I
II consu l ta o sal do
publ ic double get8al ance() I
return balance:
I
II saca fundos da conta
publi c double withdrawFunds( double amount ) I
I
if(amount > balance)1 II ajusta o valor
amount balance i
balance balance - amount i
return amounti
I
55
A classe Account ilustra os conceitos importantes existent es por trs do encapsul amento.
Account bastante abstrata. Ela funcionar como a base para mui tos tipos diferentes de cont as. A
classe Account oculta sua implementao atrs de uma interface bem definida. Finalmente, a
classe Account mostra uma divi so correta de responsabili dades, pois contm todo o conheci-
mento de como debi tar e creditar no saldo da conta. O conhecimento de como executar essas ta-
refas no 'vaza' para fora do objeto.
Dia 3
Entretanto, Accounl no perreita; ainda h espao para melhori a. Por questo de brevidade,
essa soluo de cl asse Accounl pula a validao do argumento. alm da verificao de saque a
descoberto si mples. Para usar no mundo real, voc precisaria incluir cdigo para validar todos os
parmetros dos mtodos.
laboratrio 3: o encapsulamento
o Di a 2 abordou trs caractersticas do encapsulamento eficaz:
Abstrao
Ocultao da implementao
Di viso da responsabilidade
Cada caracterstica urna habi lidade importante a ser domi nada, enquant o voc projeta e escre-
ve suas classes. Voc precisa aplicar todas as trs caractersticas pam ter objetos bem encapsulados.
Vamos apli car essas trs caractersticas em um jogo de cartas.
Primeiro, vamos aplicar a abstrao. Lembre-se de no abusar da abstrao. Voc ai nda tem um
problema para resolver e no pode resolver todos os problemas. Assim, voc deve pri meiro ten-
tar resolver os problemas que conhece!
O qu voc pode dizer generi cament e a respeito de jogos de carta j ogados com um baralho de
pquer padro?
Um bom lugar para comear no prprio mao de cartas. Um baral ho padro contm 52 cartas.
Voc pode embaralhar um mao, assim como escolher uma carta do baral ho, em qualquer posi -
o. Do mesmo modo, voc pode retomar uma carta para qualquer posio no mao. Qualquer outra
extrao apenas uma especial izao da escolha de uma carta a partir de qualquer parte do mao.
O que voc pode dizer a respeito das cartas em si?
Todas as cartas compartilham lima estrutura comum. Cada carta tem um naipe: ouros, copas, es-
padas ou paus. Cada cart a tambm tcm um valor: 2 a 10, valete, dama, rei ou s. A ni ca direren-
a de uma carta para outra o valor desses dois atributos.
Levado a um extremo, voc poderia tentar descrever cada tipo de mao de cartas, sejam elas car-
tas de beisebol ou de tar. Novamente, quando voc comea a abstrair, precisa cert ificar-se de
no abstrair em demasia.
E quanto a ocultao da implementao?
A no ser que voc roube enquanto joga baralho, nunca ver o que est no mao, at receber uma
carta. Voc tambm no insere cartas que no fazem parte do baral ho.
Final mente, e quanto responsabilidade?
Encapsul amento: hora de escrever algum cdigo 57
No mundo real, as cartas em si no fazem mui to. Uma carta simplesmente exibe seu nai pe e seu
valor. Uma cana tem um estado: face para cima ou face para baixo. Do mesmo modo, um bara-
lho no faz muito no mundo real. Em vez disso, o carteador aque le que embaralha e distribui as
cartas. O baralho simplesmente contm as cartas de j ogo.
No mundo dos computadores, uma cana conter seu naipe, valor e estado. Em um programa
simples, uma cana tambm saber como ser apresentada. Um baral ho criar e conter as cartas.
Finalmente, o caneador saber embaral har as cart as e distribuir uma carta.
NeTA
Posteri ormente, voc aprender a importncia de separar a exibio de seu mo-
delo/dados. Entretanto, para nossos objetivos aqui, voc pode mi sturar os dois.
Exposio do problema
Use as classes de projeto de descrio de carta de pquer para representar as cartas, o mao de
cartas e o caneador. EllIo, voc deve escrever um pequeno mtodo mai n() , que instancie o car-
teador e seu mao de canas, embaralhe as cartas e, em seguida, imprima o baral ho.
Este laboratrio deixa a voc mui ta margem de moviment o, enquanto projeta suas cartas, o bara-
lho e o carteador. Ao pensar nas classes que voc criar, certi fi que-se de considerar a ocul tao
da implementao e a di viso da responsabilidade. Coloque a responsabi lidade apenas onde ela
pertence e, quando voc a colocar, certifique-se de que ela no 'vaze'.
NeTA
Veja java.lang.Math.randomH para a gerao de nmeros aleatrios. A funo
randomO ser til para embaralhar o mao. Voc pOde obter a documentao
completa das APls Java no endereo http://www.javasoft.com/.
Por exemplo, (i nt ) fMath.randomO * 52) fornecer um nmero entre O e 51.
A prxima seo discutir as solues do Laboratrio 3. No prossiga at com-
pletar o laboratrio 3!
Solues e discusso
A Listagem 3.3 apresenta uma possivel classe Ca rdo
LI STAGEM 3,3 Card. j ava
public cl ass Card {
private int ranki
Dia 3
LI STAGEM 3.3 Ca rd. java (con t inuao)
private i nt suit;
priva te boolean face _up ;
II constantes usadas pa ra i nstanciar
II na i pes
publ ic static final i nt OIAMONOS 4
o
publ i c static final i nt HEARTS 3
o
publ i c static fina l i nt SPAOES 6;
public stati c fi nal
'o,
CLUBS 5;
II valores
pu bl ic static fi na l in t
'"O
2 ;
publi c static fi na 1 i nt THREE 3 ;
publi c static fi nal int FOUR 4
o
publi c static fi nal i nt FIVE
5
o
publ ic st atic fi na 1 int
SI'
6;
publ ic st atic fina l
'o,
SEVEN
,.
o
publ ic stat ic fi nal i nt EIGHT
8
o
publ ic static fina l i nt NINE 9 ;
publ ic stat i c fina l
, o,
TEN 10;
publ ic static f inal i nt JACK 74
o
publ i c st at i c f inal i nt QUEEN 81 ;
publi c stati c f i na 1
, o,
KING 75 ;
publ ic stati c fi na 1 i nt ACE 65;
II cria uma nova cart a - usa apenas as cons tantes para i ni cia l izar
pu blic Card( i nt suit, int rank ) I
}
II Em um programa real . voc preci sari a fazer a val i dao dos argumentos.
this.suit sui t;
this.rank rank;
publi c int getSuit () {
ret urn suit;
}
publ ic i nt getRank() {
return rank;
}
publ iC voi d faceUp() {
face_up true;
}
publ i c voi d fa ceOown() I
Encapsul amento: hora de escrever algum cdigo
LISTAGEM 3 .3 Ca rd. java (continuao)
}
}
publl C boolean l sFaceUp() {
return face_up;
}
public String display() {
St ring di spl ay ;
H( ra nk > 10
} I
display Str ing .valueOf( (char) rank
} el se (
di splay
String . valueOf( rank );
}
switch ( suit ) (
case OIAMONOS:
return dlsplay + String.val ueOf(
case HEARTS:
return displ ay + St r ing. val ueOf(
case SPAOES:
retur n display + St r ing.val ueOf{
default:
return display + Str i ng.va l ueOf(
}
}
} ;
(char) OIAMONOS ) ;
(char) HEARTS } ;
(char) SPAOES } ;
(char) CLUBS };
59
A definio da classe Card comea defini ndo vrias constantes. Essas constantes enumeram os
valores e naipes de carta vli dos.
Voc notar que, uma vez instanciado, no possvel mudar o valor da cm1a. As insI!i ncias de
Card so imutveis. Tornando a carta imutvel , ningum poder alterar erroneamente o valor de
uma carta.
Novo TERMO Um objelo imlltvel aquele cujo estado no muda, uma vez construido.
A classe Card responsvel por conter seu nai pe, assim corno o valor. A carta tambm sabe
como retornar urna representao de String de si mesma.
A Li stagem 3.4 apresenta uma possvel implementao de Oeck.
LISTAGEM 3.4 Oeck.java
public class Oeck {
}
}
private java.util . LinkedList deck :
publiC OeckO {
bulldCardsO;
}
public Card get( int index) {
if( index < deck . size() ) {
return (Card) deck.get( index ) :
}
return null :
}
publ iC void replace( int index. Card card ) {
deck.set( index. card ) ;
}
publ ic int size() (
return deck.size():
public Card removeFromFront() (
if( deck.size() > O ) (
Card card (Card) deck.removeFirst() ;
return card;
}
return null;
}
public void returnToBack( Card card ) {
deck.add( card );
}
private void buildCards() {
}
deck new java. util.LinkedListO ;
deck.add( new Ca rd( Card .CLUBS . Card .TWO )} :
deck.add( new Card( Card.CLUBS. Card. THREE ) };
deck.add( new Card( Card.CLUBS . Card.FOUR )} ;
deck.add( new Card( Card.CLUBS. Card.FIVE )}:
/1 a definio compl eta foi cortada por brevidade
/1 veja a l istagem compl eta no cdigo-fonte
Encapsul amento: hora de escrever algum cdigo 61
A classe Deck responsvel por instanciar as cartas e, em seguida, fornecer acesso a elas. A clas-
se Oeck fornece mlodos para recuperar c rclomar as cartas.
A Li stagem 3.5 apresenta a implementao de Oeal er.
LISTAGEM 3.5 Oea 1 er . java
publ i c class Dealer I
I
private Deck deck i
publiC Dea l e r ( Deck d li
deck =d i
I
public voi d shuffle() 1
I
Il torna o array de cartas aleatrio
int num_ca rds deck.size()i
for( in t i .. O; i < num_c ards; i ++ ) I
I
int index " (int)( Math.random() * num_cards )i
Card card_i .. ( Card ) deck.get( i ) ;
Card card_index a ( Card ) deck.get( index )i
deck.replace( I. card_index ) i
deck.replace( index , card i )i
public Card dealCard() I
if( deck.size() > O ) I
return deck. remove FromFront() ;
I
return null;
I
A classe Dealer responsvel por embaral har o mao e di stribuir as cartas. Essa implementao
de Oeal er honesta. Outra implementao de Deal er poderia dar as cartas a partir do final do ba-
ralho!
Todas as trs classes tm uma diviso da responsabilidade clara. A classe Card representa cartas
de pquer, a c lasse Deck contm as cartas e a classe Oea ler distribui as cartas. Todas as trs clas-
ses tambm ocultam sua implementao. Nada sugere que a classe Oeck tenha realmente uma
UnkedUs t de cartas.
Dia 3
Embora Ca rd possa definir vrias constantes, isso no compromete a integridade de sua imple-
mentao, pois a classe Ca rd est livre para usar as constantes como quiser. Ela tambm est li-
vre para mudar os valores das constantes a qualquer moment o.
O mtodo bui l dCards() de Deck destaca uma deficincia da ocultao da implementao. Voc
poderi a instanciar cartas com nmeros de 2 a 10 em um lao for. Se voc examinar as constan-
tes, ver que 1WO a TEN contam de 2 alO, seqencialment e. Tal lao mui to mais simples do que
instanciar cada carta individualmente.
Entretanto, tal suposio o vincul a aos valores correntes das constantes. Voc no deve penn itir
que seu programa se torne dependente de determinado valor, escondido na constante. Em vez
disso, voc deve usar a constante cegamente, chamando Cardo TWO , Card. THREE, etc. Voc no
deve fazer quaisquer tipos de suposies sobre o valor. Card poderia redefini r os valores das
constantes a qualquer momento. No caso de bui 1 dCards () , fc il cair na tentao de usar os va-
lores das constantes di rctamcnle.
Aqui, o contrato entre Card e o usurio das constantes de Card so os nomes das constantes e no
seu valor subjacente. O Dia 12, "Padres avanados de projeto", apresentar urna soluo um
pouco mais elegante do que esse uso de constantes.
laboratrio 4: estudo de caso -
de primitivas Java (opcional)
os pacotes
o Laboratrio 4 um laboratrio opcional. Embora a concluso do laboratrio
d a voc mais idias sobre a programao orientada a objetos, sua concluso
no necessria para ter xito nos prximos dias.
Cada linguagem orientada a objetos tem suas prprias regras para detenninar o que e o que no
um objeto. Algumas linguagens orientadas a objetos so mais 'puras' que outras. Uma lingua-
gem puramente ori entada a objetos, como a Smalltalk, considera ludo um objeto, at mesmo
operadores e primitivas.
Novo TERMO Uma linguagem ori entada a objetos pllra suporta a noo de que ludo um objeto.
Em uma linguagem puramente orientada a objelos, tlldo- classes, primitivas, operadores e at
blocos de cdigo - considerado um objeto.
A linguagem Java tem suas prpri as regras para determinar o que e o que no um objcto. Na
linguagem Java nem tudo um obj eto. Por exemplo, a linguagem Java declara diversos valores
de primiti vas. As primitivas no so consideradas objetos na linguagem Java. Essas pri mitivas
compreendem boolean, char, byte, short, i nt, 10ng, float c double.
Encapsulamento: hora de escrever algum cdigo 63
Novo TERMO Uma linguagem orielllada a objelos no considera tudo um objclO.
As primiti vas oferecem algumas vantagens em relao os objetos. Para usar uma primiti va, voc
no precisa instanciar uma nova instncia usando new. Como resul tado, usar uma primi tiva muito
mais eficiente do que usar um objeto, pois ela no sofre da sobrecarga associada aos objetos.
Por outro lado, s vezes voc achar o uso de primitivas limitant e. Voc no pode tratar pri miti-
vas como objctos. Isso signifi ca que voc no pode us-Ias em lugares que exigem um objelo.
Considere java . uti 1 . Vector, da colco de classes genricas. I)ara colocar um valor no vetor,
voc precisa chamar o mtodo add () do vetar:
public boolean add( Object o ) i
Para armazenar um valor no vetor, o valor deve ser um obj eto. Colocado de maneira simples, se
voc quiser colocar lima pri mitiva em um vetor, estar sem sorte.
Para cont ornar essas fa lhas, a linguagem Java tem vrios pacotes de primitivas, incluindo Boo-
lean, Character, Byte, Ooubl e, Fl oa t, Integer, l ong e Short. Essas classes so chamadas de pa-
cotes, pois elas contm, ou possuem, um valor de pri miti va.
Novo TERMO
Um pacole um objeto cujo nico propsito conter outro objcto ou primiti va. Um pa-
cote fornecer qualquer nmero de metodos para obter e manipularo valor possudo.
Vamos considerar a interface pblica de Boolean, que est delineada na Listagem 3.6.
LISTAGEM 3.6 java.1ang.Boolean
publ i C final cl ass Boolcan impl ements Se r ial izable I
publi c Boolean( boolean value ) ;
I
publ i c Boolean( String s l i
publiC st atic final
public static final
publi c static final
Bool ean
Boolean
ClASS
FAlSE;
TRUEi
TYPEi
publiC static boolean getBoolean( St ring name }i
publi c stati c Boolean valueOf( String s )i
publ iC boolean booleanValue() ;
public boolean equals( Object obj li
publ ic int hashCode();
publ i c Stri ng toSt r i ng( )i
NOTA
Dia 3
Final se ref ere ao conceito de impedir que classes descendentes alterem esse
el emento, quando herdadas. A herana ser discutida no Dia 4, -Herana: ob-
tendo algo para nadaM.
Impfements est relacionado constr uo de ' interface' especial da lingua-
gem Java, discuti da no Apndice B, ' Aesumo do Java' .
Internamente, o pacote Bool ean conter uma primitiva booleano Assim, para passar um valor
boa 1 ean para um vetor, voc precisaria primeiro instanciar um pacote Boo1 ean. possuir a pri-
mitiva boo 1 ean e passar esse pacote para o vetor.
A interface Boo 1 ean introduz outros recursos das linguagens orientadas a objetos: mto-
dos de cl asse e vari veis de classe.
At agora, todos os mtodos e variveis que voc viu eram mtodos de instncia e va-
riveis de instncia. Isto , cada varivel e cada mtodo est ligado a alguma instnci a de
objeto. Para chamar o mtodo ou acessar a varivel. voc deve ter uma instncia do objeto.
O fat o de que voc precisa de uma instncia freqentemente lgico. Considere o m
todo booleanvalueO de Boolean. O mtodo booleanValueO um mtodo de inst ncia. O
valor que o mtodo retorna depender do est ado interno das instncias de Boo I ean indi-
viduais. Uma inst ncia pode possuir o valor true, out ra pode possuir o valor fal se. O
valor retornado depender do val or que a instncia contm int ernamente.
Agora, considere o mtodo get8001 ean() de Boolean. Esse um mtodo de classe. Se
voc estudar a definio de getBooleanO, notar a pal avra-chave static. Na li ngua-
gem Java, a palavra-chave statle declara que o mtodo ou varivel um mtodo ou
var ivel de classe.
Ao contrri o das variveis e mtodos de instncia, os mtodos e varivei s de classe no
esto vinculados a nenhuma instncia. Em vez disso, voc acessa mtodos de cl asse
atravs da prpria cl asse. Assim, para chamar getBooleanO, voc no precisa de uma
instncia (contudo, voc ainda poderia chamar o mtodo como se el e fosse um mtodo
de instncia). Em vez disso, voc pode simplesmente chamar Boolean.getBoolean(). A
resposta de getBoolean() no depende do estado de nenhuma instncia. Por isso, ele
pode escapar impunemente, sendo declarado como um mtodo de classe.
Novo TERMO
Variveis de classe so variveis que pertencem cl asse e no a uma
instncia especfi ca. As variveis de cl asse so compartilhadas entre
todas as inst ncias da classe.
Novo TERMO
Mtodos de classe so mtodos que pertencem classe e no a uma
instncia especifica. A operao executada pelo mtodo no depen-
dente do estado de qualquer instncia.
As variveis de classe funcionam da mesma manei ra. Voc no preci sa de uma instn-
cia para acess-Ias. Entretanto, elas tambm t m outro uso. Como a vari vel mantida
no nfvel da classe, todas as instncias comparti lham a mesma varivel (e, se for pbli ca,
todos os objetos podero compartilh-Ia). As variveis de cl asse diminuem os requisi-
t os de memria. Considere publ i e statle final Boolean FAlSE'. Essa uma constante que
possui o valor fa I se. Como ela esttica, todas as instncias comparti lham essa mesma
constante. Cada instncia no precisa de sua prpria cpi a. Considere a classe, Counte<!-
Object, a seguir:
Encapsul amento: hora de escrever algum cdigo
publlC class CountedObject {
I
private static i nt instances;
,u Cri a novo CountedObject */
public CountedObj ectO {
i nstances++:
I
oubl ic s tat ic int oetNumberi ns tancesO I
return instances:
I
oublic static void mainr Strino n aros) I
CountedObiect obi = null:
I
for{ int i = O: i < 10: i++ I I
obi new CountedObiect():
I
Svstem.ouLorintlnl "Instances created: " +
ob:i .oetNumberInstances II \:
/I note oue isso tambm funcionari
Svstem.ouLorintlnl "Instances created: +
CountedObiect.oetNumberlnstancesO \:
65
CountedObject declara uma varivel de classe chamada instances. Ela tambm declara
um mtodo de classe para recuperar o valor, getNumberInstances (). Dentro do constr utor,
o valor incrementado sempre que uma instncia criada. Como todas as instncias
compartilham a varivel, a varivel i nstances atua como um contador. medida que
cada objeto criado, ela incrementa o contador.
O mtodo ma i n () cria 10 instncias. Voc notar que pOde usar uma instncia para fazer
a chamada de getNumberlnstances{) ou a prpria classe.
Se voc vai ou no declarar um mtodo ou varivel esttica uma deciso de projeto.
Se o mtodo ou varivel for independente do estado de qualquer instncia, provavel-
mente uma boa idia torn-lo um mtodo ou varivel de classe. Entretanto, voc no
pode declarar variveis e mtodos que so dependentes da instncia, como estticos,
como o mtodo booleanValueO de Boolean.
Voc pode ter feito algumas observaes a respeito de Boo I ean. Se voc estudar a interface, nota-
r que no h meios de mudar a valor bool ean possudo, uma vez que tenha inslanciado a instn-
cia de Boolean! Como voc no pode mudar seu valor, diz-se que as instncias de Boolean so
imutveis.
Existem ocasies em que usar um objeto imutvel fundamental. Se voc estiver fami liari zado
com linhas de execuo, um obj cto imutvel inerent emente seguro quanto a linha de execuo,
pois seu estado nunca pode mudar.
Dia 3
Entretanto, existem ocasies em que os objetos imutveis causam mais danos do que trazem
vantagens. No caso dos pacotes de pri mitivas, a sobrecarga da instanciao de um pacote para
cada primiti va pode se tornar dispendiosa.
Exposio do problema
Para o Laboratri o 4, voc precisa criar um pacote de primit iva Bool ean mutvel. No mnimo,
esse pacote deve pennitir que voc obtenha e confi gure o valor possudo. O pacote tambm
deve fornecer dois construtores: um construt or noargs e um construtor que recebe o valor inicial
do pacote.
Sinta-se livre para adicionar quaisquer outros mtodos que considere conveniente. Entretanto,
no se esquea de seguir as regras do encapsul amento eficaz.
Talvez voc ache interessante examinar a discusso do Apndice B sobre a palavra-chave sta-
tic. se decidir fornecer todos os mtodos oferecidos pelo pacote de primitivas Bool ean.
ALERTA
A prxima seo discutir as solues do Laboratrio 4. No prossiga at com
pletar o Laboratrio 4!
Solues e discusso
A Li stagem 3.7 apresenta uma possvel soluo para o Laboratri o 4.
LISTAGEM 3.7 MyBoolean.java
publi c class MyBoo l ean {
II algumas cons tantes, por convenincia
publi c static final Class TYPE K Boolean.TYPE;
private boolean va l ue;
II construtor sem argumento - tem false como padro
publi c MyBooleanO {
val ue fal se ;
}
II configura o valor inicial como value
publi c MyBool ean( boolean value ) {
t his. val ue vai ue;
}
publ ic boolean booleanVa lueO {
Encapsul amento: hora de escrever algum cdigo 67
LI STAGEM 3.7 MyBoolean.java (continuao)
}
return value :
}
publiC void setBooleanValue{ boolean va l ue ) I
this . value E value:
}
II para getBoolean e valueOf. podemos simplesmente delegar para Boolean
II voc vai aprender mais sobre delegao no Captulo 4
public static boolean getBoolean( St ring name ) I
return Boolean.getBoolean( name );
}
public static MyBoolean valueOf( St ring s ) {
ret urn new MyBoolean( Boolean.getBoolean( s ) ) ;
}
II definies de hashCode . equals e toString omit i das por brev i dade
MyBoolean mantm a interface pbl ica encontrada em Boolean, com trs excees:
MyBoo 1 ean adiciona um mutant e: pub 1 i c voi d setBoo 1 eanVa 1 ue ( boa 1 ean va 1 ue ). Esse
mutante permi te que voc mude o valor dos pacotes.
MyBool ean redefi ne val ueOf () de modo que retorne uma instncia de MyBoolean, em vez
de Boolean.
MyBool ean remove as constantes TRUE e fAlSE. Agora que MyBoolean mutant e, esses va-
Iares no se tornam constantes adequadas, pois seus valores podem ser alterados por qual-
quer um, a qualquer momento.
A soluo do Laboratrio 4 tambm fornece um vislumbre do Dia 4, "Herana: obtendo algo
para nada". Mtodos como va 1 ueOfO demonstram a delegao. A soluo de cdigo-fonte com-
pleta do Laboratrio 4 tambm proporciona urna viso da herana e da sobrecarga, atravs dos
mtodos toString() I hashCode() e equals().
Perguntas e respostas
P No Laboratrio 3, voc escreveu, "Essa implementao de Deal er honesta. Outra
implementao de Dea1 er poderia distribuir as cartas a partir do final do baralho! "
O que voc quer dizer com outra implementao?
R Voc pode dizer que os mtodos shu ffl eC) e dea 1 Ca rdO constit ucm a intcrface pblica
de Dea ler. A classe Dea 1 er apresentada honesta. Ela di stribui as cartas a partir do incio
Dia 3
do baral ho. Voc poderia escrever outro carteador, chamado OishonestDealer, que ti-
vesse a mesma interface pbl ica. Entretanto, esse carteador poderi a distribuir as cartas a
partir do final do baralho.
Voc chama esse carteador de outra implementao, porque ele reimplementa uma inter-
face igual quela encont rada em Oea 1 er. Entretanto, essa classe implementa a funcionali-
dade oculta no mtodo de forma ligeiramente di ferente.
P O encapsulamento pode ser prejudicial?
R Na verdade, o encapsulament o pode ser prejudicial. Imagine que voc tenha um compo-
nente que efetue clculos matemticos. Suponha que voc prec ise manter determinada
preciso, quando concluir seu clcul o. Infelizmente, o componente pode encapsular
completamente a quantidade de preciso que mantm. Voc poderia acabar com um va-
lor incorrelo, se a implementao usasse uma preciso diferente daquela que precisa.
Voc pode acabar com erros estranhos, se al gum alterar o componente.
Ass im, o encapsulamento pode ser prejudicial, se voc precisar de um controle preciso
sobre as maneiras pelas quais um objeto manipula seus pedidos.
A nica defesa a boa documentao. Voc deve documentar todos OS detalhes e suposi-
es importantes da implementao. Uma vez documentados, voc no poder fazer al-
teraes facilmente cm quaisqucr dctalhcs ou suposies documentados. Assim como no
componente matemti co, se voc fizer uma alterao, correr o risco de prejudicar todos
os usuri os desse objeto.
Workshop
As perguntas e respostas do teste so fornecidas para seu melhor entendimento. Veja as respos-
tas no Apndice A, " Respostas".
Teste
I. Examine a c lasse Account do Laboratrio 2. Qual(is) rntodo(s) (so) mutante(s)?
Qual(is) rntodo(s) (so) acessor(es)?
2. Quais so os dois tipos de construtores? A partir das sol ues de laboratrio, encont re
um exemplo de cada ti po de construtor.
3. (Opcional) Boolean, conforme discut"ido no Laboratrio 4, declara trs variveis pbli-
cas. Neste caso, o uso de vari veis pbl icas aceitvel. Voc pode explicar por que est
certo usar variveis pbl icas nesse caso?
4. (Opcional) Como voc pode tomar a soluo do Laboratri o 3 mais eficiente?
Encapsulamento: hora de escrever algum cdigo 69
5. Por que voc acha que a soluo do Laboratrio 3 no criou uma classe Card separada
para cada nai pe?
6. No Laboratri o 3, voc explorou a di viso da responsabilidade. Quais vantagens a divi
so da responsabil idade proporciona s classes Ca rd, Deck e Dealer?
Exerccos
I. (Opcional) Pegue o Laboratrio 2 e abstraia Ooub leKey ainda mais. Refaa o projeto de
Doubl eKey de modo que ela possa aceitar qualquer tipo de objeto como chave - no ape
nas urna String.
Para que sua nova classe Ooub 1 eKey funcione, voc precisar alterar a definio dos mto-
dos equal s () e hashCode{). Esses mtodos foram omitidos por brevidade nas solues im
pressas. Entretant o, os mtodos esto disponveis no cdigo fonte completo das solues.
2. (Opcional) No Laboratri o 3, as instncias de Card sabem como se apresentar. Entrctan
to, a classe Oeck no sabe como se apresentar sozinha. Refaa o projeto de Oeck de modo
que as instncias de Oeck saibam como se apresentar.
SEMANA 1
DIA
Herana: obtendo algo para nada
Nos trs ltimos dias, voc se concentrou em aprender sobre o primeiro pilar da programao
orientada a objelos: encapsulamento. Embora o encapsulamento seja um conceito fundamenta l
na POO, h mais na histria do que apenas suportar TADs e mdulos si mples. Na verdade, a
POO ofereceria muito pouco cm relao ao estilo de programao antigo, se ludo que ela fizesse
fosse oferecer encapsulamento simples. claro que a POO oferece muito mais.
A POO vai alm, adicionando dois outros recursos: herana e polimorfismo. Voc vai passar os
prximos dois dias considerando a herana, o segundo pilar da POO.
Hoje voc vai aprender:
O que herana
Os diferentes tipos de herana
Algumas das armadi lhas da herana
Dicas para a herana eficaz
Como a herana atende aos objetivos da 00
o que herana?
Ontem, voc viu como o encapsulamento penniteescreverobjetos bem definidos e indepcnden
teso O encapsulamento permite que um objeto IIse outro obj eto, atravs de mensagens. O liSO
apenas uma das maneiras pelas quais os obj etos podem se relacionar na POO. A POO tambm
fornece uma segunda maneira de relacionamento entre os objetos: herana.
Dia 4
A herana permite que voc baseie a defi ni o de uma nova classe em uma classe previamente
existente. Quando voc baseia uma classe em outra, a definio da nova classe herda aut omati-
camente todos os atributos, comportamentos e implementaes presentes na classe previamente
existente.
Novo TERMO
Herana um mecanismo que pennite a voc basear uma nova classe na definio
de uma classe previamente existente. Usando herana, sua nova classe herda todos
os atributos e comportamentos presentes na classe previamente existente. Quando uma classe
herda de outra, todos os mtodos e atributos que aparecem na interface da classe previamente
existente apareceri\o automaticamente na interface da nova classe.
Consi dere a classe a segui r:
publi c class Empl oyee {
I
private String f1rst_name
private String last_name
privat e double wage
public Employee( String first_name . Stri ng last_name. double wage ) {
this .first name f i rst_name
this.last name last_name
t his.wage wage
I
public double getWage() {
return wage
I
public String getFirstName() I
return fi rst_name
I
publ iC String getLastName() I
return last_name
I
Instncias de uma classe como Emp 1 oyee podem aparecer em um aplicat ivo de banco de dados
de folha de pagamento. Agora, suponha que voc precisasse modelar um func ionrio co-
missionado. Um funcionrio comiss ionado tem um salrio-base, mais uma pequena comisso
por venda. Alm desse requisito simples, a classe Corrmi ssi onedEmployee exatamente igual
classe Empl oyee. Afinal, um objeto COfllTri ssi onedEmployee um objeto Employee.
Usando-se o encapsulamento di reto, existem duas maneiras de escrever a nova classe COIIIlli ss i -
onedEmpl oyee. Voc poderi a si mplesmente repetir o cdigo encontrado em Emp loyee e adicionar
Herana: obtendo algo para nada
o cdigo necessrio para cont rolar comisses e calcular o pagamento. Entretanto, se voc fizer
isso, ter de mant er duas bases de cdigo separadas, mas semel hantes. Se voc precisar corrigir
um erro, ter de faz-lo em cada lugar.
Assi m, simplesmente copiar e colar o cdigo no boa uma opo. Voc precisar tentar outra
coisa. Voc poderia ter uma varivel employee dentro da classe Corrrni ss ionedEmpl oyee e dele-
gar todas as mensagens, como getWageO e getfirstNameO, instncia de Employee.
Novo TERMO
Delegaao o processo de um objeto passar uma mensagem p.1ra outro objeto, para
atender algum pedido.
Entretanto, a delegao ainda o obriga a redefinir tooos os mtooos encontrados na interface de
Emp 1 oyee para passar tooas as mensagens. Assim, nenhuma dessas duas opes parece sati sfatria.
Vamos ver COmO a herana pode corri gir esse problema:
publi c class CommissionedEmployee extends Employee {
}
private double commission;
private int units;
II o custo por unidade
II controle do nmero de unidades vendidas
publiC CommissionedEmployee( String firs t _name. String last_name.
double wage. double commission ) (
}
super( fi rs t _name , last_name , wage ); II chama o construtor original
II para inicializar corretamente
11 0 valor da comisso
this.commission commission;
publ ic double calculatePay() I
return getWage() + ( commission * uni ts ) ;
}
public void addSales( lnt units ) {
thiS.units this.units + units ;
}
public void resetSales() {
units O;
}
Aqui, CommissionedEmpl oyee baseia sua definio na classe Empl oyee j existente. Como
Commi ss i onedEmp I oyee herda de Emp 1 oyee. getFi rs tName O, getLas tName O, getWage O.
first_name. l ast _name e wage se tomaro tooos parte de sua defi nio.
Dia 4
Como a interface pblica de Empl oyee se toma parte da interface de Conmi ssionedEmployee, voc
pode enviar para ConmissionedEmpl oyee qualquer mensagem que poderia enviar para Employee.
Considere o mtodo ma inO a seguir, que faz exatamenle isso:
publ i c static yoid ma;n(String [) args ) 1
J
Commiss1onedEmployee c
new Coomi ss i onedEmp I oyee ("Mr. " Sa 1 es" 5. 50 . 1. 00) ;
c.addSal es(5);
System.out.println( KFirst Name: " + c.get FirstNameO ) ;
System.out.println( "last Name : + c.get l astNameO ) ;
System.out.pri ntln( "Base Pay:$ + c. getWageO };
System.out.pri ntln( "Total Pay:$ " + c.calculat ePayO ) ;
A Figura 4. I ilustra o que voc ver aps a execuo desse cdigo.
FIGURA 4 .1
S(l(/a ge/'(/da a punir de
COIIlfIiss ionedflllp I oyee.
Por que herana?
Conforme voc viu no lt imo exemplo, s vezes o relacionament o de liSO do encapsulamento
simples no suficiente. Entretanto, h mais na herana do que si mplesmente herdar urna inter-
face pblica e impl ementao.
Conforme voc ver posteriormente no dia de hoje, a herana permite classe que est herdando
redefi nir qualquer comportamento de que no goste. Tal recurso permite que voc adapte seu
soft ware, quando seus requi sitos mudarem. Se voc precisar fazer uma alterao, bastar escre-
ver uma nova classe, que herde a antiga funcionalidade. Ento, sobreponha a funcionalidade que
precisa mudar ou adicione a funcional idade que est fal tando e pronto. A sobreposio interes-
sante. pois permite mudar a maneira como um objeto funciona sem tocar na definio original da
classe! Voc pode deixar seu cdigo bem testado e validado intacto. A sobreposio funciona
mesmo que voc no tenha o cdigo-fonte original de uma classe.
A herana tem outro uso mui to importante. No Dia I, "Int roduo programao ori ent ada a ob-
jelos", voc viu como uma classe agrupa objetos relacionados. A herana pemlite que voc agrupe
classes relacionadas. A POO sempre se esfora por produzir software natural. Assi m como no
mundo real, a POO pennite que voc agrupe e classifi que suas classes.
Herana: obtendo algo para nada
"E um" versus "tem um": aprendendo
quando usar herana
Para apresemar os mecanismos de herana, a primei ra seo abordou o que conhecido como
herana de implemelltao. Conforme voc viu, a herana de implementao permite que suas
classes herdem a implementao de outras classes. Ent retanto, somente porque uma classe pode
herdar de Qlura no significa que isso deve ser feito!
Ento, como voc sabe quando deve usar herana? Felizmente, existe uma regra geral a ser se-
guida, para evitar uma herana incorreta.
Quando voc est considerando a herana para reut i lizao ou por qualquer outro moti vo, preci-
sa primeiro perguntar-se se a classe que est herdando do mesmo tipo que a classe que est sen-
do herdada. O fato de pensar em termos de tipo enquant o se herda freqUentemente rererido
como teste ' um' .
,
Novo TERMO
E 1111/ descreve o relacionamento em que uma classe considerada do mesmo tipo de
outra.
Para usar ' um' , voc diz a si mesmo, "um objeto ConmissionedEmployee ' um' Empl oyee".
Essa declarao verdadeira e voc saberi a imediatamente que a herana vlida nessa sit ua-
o. Agora, pare e considere a interface Iterator Java:
public interface I terator 1
J
publ ic boolean hasNext();
publ ic Object next()j
public void remove()j
Digamos que voc qui sesse escrever uma classe que implementasse essa interrace. Se voc lem-
brar do Dia 2, poder perceber que uma implementao de Queue poderia ser til na const ruo
de sua interrace Iterator. Voc poderia usar toda a implementao de Queue previamente exis-
tente, para conter os elementos da interface Itera tor. Quando voc precisa verificar hasNext ()
ou remove () , pode simplesmente chamar o mtodo Queue correto e retornar o resultado.
Nesse caso, a herana fornecer um modo rpido de implementar lima interface Iterator. Entre-
tanto, ames de comear a codificar, no se esquea do teste ' um'.
"Uma interface Itera tor ' uma' Queue". Claramenle essa declarao fa lsa. Esquea-se de her-
dar de Queue!
NOTA
Uma Queue pode ' ter uma' interface Iterator que saiba como percorrer os ele-
mentos.
Dia 4
Existi ro muitas situaes onde o teste ' um' falhara, quando voc quiser reuti lizar alguma im-
plememao. Fel izment e, existem outras maneiras de reutil izar implementao. Voc sempre
pode usar composio e delegao (veja o quadro a seguir). O teste ' tem um' salva o dia.
NovO TERMO
Tem U/II descreve o relacionamento em que uma classe contm uma instncia de ou-
tra classe.
NovO TERMO
Composi(io significa que urna classe implementada usando-se variveis intemas
(chamadas de variveis membro), que contm instncias de outras classes.
Composio uma forma de reutilizao que voc j viu. Se voc no puder herdar,
nada o impede de usar instncias da out ra classe dentro da nova classe. Quando voc
quiser usar os recursos de outra classe, use simplesmente uma i nstncia dessa classe
como uma de suas partes constituintes. claro que voc sofre as limitaes apresenta
das anteriormente.
Considere novamente o exemplo Queuej lterator. Em vez de herdar de Queue, a interface
Iterator pode simplesmente criar uma instncia de Queue e armazen-Ia em uma vari-
vel de instncia. auando a interface Iterator precisa recuperar um elemento ou verifi-
car se est vazia, ela pode simplesmente delegar o trabalho para a instncia de Queue,
como demonstrado na Figura 4.2.
FIGURA 4.2
Uma illll!lface Iterator
delegando chamadas de
miooo para Queue.
HasNextU
InstAncia de lteflllQl'
IsEmptyU InslAncia
de allelle
Quando usa composio, voc escolhe cuidadosamente o que vai usar. Atravs da dele-
gao, voc pode expor alguns ou todos os recursos de seus objetos constituintes. A Fi-
gura 4.2 ilustra como a interface I terator direciona o mtodo hasNext () para o mtodo
isEmptyO de Queue.
importante indicar que a delegao difere da herana de duas maneiras importantes:
1. Com a herana. voc tem apenas uma instnci a do objeto. Existe apenas um obje-
t o indi visvel, pois oque herdado se torna uma part e intrinseca da nova classe.
2. A delegao geralment e fornece ao usurio apenas o que est na interface publ i-
ca. A herana normal d mais acesso aos detalhes internos da classe herdada. Va-
mos falar a respei to de t al acesso em detal hes, no final da li o de hoj e.
Herana: obtendo algo para nada 77
Aprendendo a navegar na teia emaranhada
da herana
Os conceitos de ' um' e composio mudam a natureza da discusso sobre herana da ambicio-
sa reutil izao da implementao para inter-relacionamentos de classe. Uma cl asse que herda de
outra deve se relacionar com essa classe de alguma maneira, para que os relacionamentos ou hie-
rarqui as de herana resultant es faam sent ido.
Novo TERMO
Uma hierarquia de herana um mapeamento do tipo rvore de relacionamentos
que se ronnam entre classes como resultado da herana. A Figura 4.3 ilustra uma hierar-
quia real extrada da linguagem Java.
FIGURA 4.3
Fermat
Um exemplo de hierarqllia
de j ovo. text o
tmefemm MluageF"""' 1 Num"-rf"ormM
Simpleo.tlForrnet
ChoiceForm.1t Ded .... IForm.t
A herana define a nova classe, afilha, em termos de uma classe antiga, a progenitora ou me.
Esse relacionamento filha-progenitora ou filha-me o relacionamento de herana mais sim-
ples. Na verdade, todas as hi erarquias de herana comeam com uma progenitora e uma fil ha.
Novo TERMO
Novo TERMO
A classe filha a classe que est herdando; tambm conhecida como subclasse.
A classe progenitora ou me a classe da qual a fi lha herda diretamente; ela tambm
conhecida como superclasse.
A Figura 4.4 ilustra um relacionamento progenitora/filha. NumberFonnat a progenitora das duas
filhas Chol ceFo nnat e Dec i ma lFonnat .
Dia 4
FIGURA 4.4
NumlMlrl'ormat
Uma progellitor a com
\'{;rias filhas.
ChoiceFonnet OeclmalFormat
Agora que voc j viu mais algumas definies, pode refinar a defini o de herana.
Novo TERMO
Herana um mecanismo que pemlite estabelecer relacionamentos ' um' entre
classes. Esse relacionamento tambm pennite que uma subclasse herde os atributos
e comportamentos de sua superclasse.
NOTA
Quando uma filha herdar de uma progenitora, a filha obt er todos os atributos
e comportamentos que a progenitora possa ter herdado de outra classe.
Confonne voc viu, para que a hierarquia de herana faa sentido, deve ser possivel fazer na fi-
lha tudo que possivel fazerem sua progenitora. isso que o teste ' um' realmente testa. A uma
mha s6 permit ido aumentar a funcionalidade e adicionar funcionalidades. Uma fi lha nunca
pode remover funcionali dade.
Se voc verificar que uma filha precisa remover funci onali dade, isso ser uma
indicao de que ela deve aparecer antes da progenitora na hierarqui a de he-
rana!
Assim como pais e filhos da vida real, as fi lhas e progenitoras da classe sero semelhantes entre
si. Em vez de compartilhar genes, as classes compartilham informaes de ti po.
NOTA
Como na vida real dos filhos, uma classe pode ter apenas uma progenitora flsi-
ca. Tudo depende de como a linguagem implementa herana.
Algumas l inguagens permitem que uma classe tenha mai s de uma progeni to-
ra. Isso conhecido como herana mlt ipla.
Algumas linguagens restringem a filha a uma progenitora.
Outras l inguagens, como Java, permitem apenas uma progenitora por imple-
mentao, mas fornecem um mecanismo para herdar mlti plas interfaces
(mas no a implementao, apenas as assi naturas de mtodo).
Herana: obtendo algo para nada
Assim como as filhas reais, as classes fil has podem adicionar novos comportamentos e atributos
a si mesmas. Por exemplo, uma fil ha real pode aprender a tocar piano. mesmo que a me nunca
tenha aprendido. Do mesmo modo, uma filha pode redefinir um comportamento herdado. For
exemplo, a me pode ter sido m aluna de matemtica. A filha pode eSlUdar mais e se tornar uma
boa aluna de matemtica. Quando voc quer adicionar novo comportamento em uma classe, pode
fazer isso adicionando um novo mtodo na classe ou redefinindo um comportamento ant igo.
Mecnica da herana
Quando uma classe herda de out ra, ela herda implementao, comportamentos e atributos. Isso
signi fi ca que todos os mtodos e atributos disponveis na interface da progenit ora aparecero na
interface da filha. Uma c lasse construda atravs de herana pode ter trs tipos importantes de
mtodos e at ributos:
Sobreposto: a nova classe herda o mtodo ou atributo da progenitora, mas fornece uma
nova definio.
o Novo: a nova classe adiciona um mtodo ou atributo completamente novo.
o Recursivo: a nova classe simplesmente herda um mtodo ou at ributo da progenitora.
A maioria das li nguagens 00 no permite que voc sobreponha um atributo.
Entretanto, o atributo sobrepost o foi i ncludo aqui para sermos completos.
Primeiro, vamos considerar um exemplo. Em seguida, exploraremos cada tipo de mtodo e atri-
buto.
public class TwoDimcns1onal Point (
private double x_coord;
private double y_coordi
publiC TwoDimensional Poi nt( double x,double y ) (
setXCoordinate( x );
setYCoordinate( y ) i
}
public double getXCoordi nate() {
return x_coord;
}
public void setXCoordinate ( double x ) {
x coord = Xi
}
}
publ ic double getYCoordinate() I
relurn y_coord;
}
Dia 4
public void setYCoordinate( double y ) 1
y_coord y;
}
public String toString() (
}
return "I am a 2 dimensional poinl.\n " +
~ y x coordinate is: " + getXCoordinateO + "\ n" +
"My y coordinate is: " + getYCoordinateO:
publi C class ThreeDimensionalPoint extends TwoDimensionalPoint (
}
}
private double z_coord :
public ThreeOimensionalPoint( double x. doubl e y. double z ) (
super( x.y) ; II inicializa os atributos herdados
}
II chamando o construtor progenitor
setZCoordinate( z ) ;
publiC double getZCoord inale() {
return z_coord:
}
public void setZCoordinate( double z ) {
z coord z'
- .
publiC Stri ng toString()
I
return "I am a 3 dimens i onal point. \ n" +
"My x coordinate is:
..
+ gelXCoordinate() + U\n" +
"My Y coordinate is:
..
+ getYCoordinate() + "\n" +
"My z coordinate is:
..
+ getZCoordinate();
}
Aqui, voc tem duas classes ponto que representam pontos geomtricos. Voc poderi a usar pon-
tos em uma ferramenta de traado de grficos, em um modelador visual ou em um planejador de
vo. Os pontos tm mui tos usos prticos.
Aqui, TwoOimens ionalPoint contm coordenadas x e y. A classe define mtodos para obter e
configuraras pontos, assi m como para criar uma representao de String da instncia do ponto.
Herana: obtendo algo para nada
ThreeDimensionalPoinl herda de TwoDimensionalPoint. ThreeDimensionalPoi nl acrescenta a
coordenada z, assi m corno um mtodo para recuperar a valor e para confi gurar o valor. A classe
tambm fornece um mtodo para obter uma representao de String da instncia. Como Thr ee-
Dimensional Poinl herda de TwoDimensional Poi nt, ela tambm tem os mtodos contidos dent ro
de TwoDimensionalPoint.
Esse exemplo demonstra eada tipo de mtodo.
Mtodos e atributos sobrepostos
A herana perrnite que voc pegue um mtodo ou atributo previamente existente e o redefina. A
redefinio de um mtodo permite que voc mude o comportamento do objeto para esse mtodo.
Um mtodo ou at ributo sobreposto aparecer na progenitora e na filha. Por exemplo, ThreeDi-
mensionalPoint redefine o mtodo toStringO que aparece em TwoDlmenslonalPoint:
II de TwoDimensionalPoint
publ ic String toString() {
return "I am a 2 dimensional poinl. \n" +
"My x coordinate is: + getxCoordinateO + "\n" +
"My Y coordinate is: + getYCoordinateO:
}
TwoOimens iona I Point define um mtodo toSt r i ng() que identifi ca a instncia como um ponto
bidimensional e impri me suas duas coordenadas.
Th reeOimensionalPoint redefi ne o mtodo toSt ringO para identi fi car a instncia como um
ponto tridimens ional e imprime suas trs coordenadas:
II de ThreeOimensional Point
public String toString() {
return "I am a 3 dimensional
"My x coordinate is:
"My Y coordinate is:
"My z coordinate is:
}
Considere o mtodo mainO a seguir:
point.\n" +
"
+ getXCoordinate()
"
+ getYCoordinate()
"
+ getZCoordinate();
publ ic stati c void main( String [] args ) {
+ "\n" +
+ "\n" +
TwoDimensionalPoinl two : new TwoDi mensionaIPoint(1.2);
ThreeDimens ionalPoint three = new ThreeOimensionalPoi nt(1.2.3);
Syslem.out. pr int ln (two.toString( :
Syslem.out. pr int ln(three . toStri ng( ;
}
A Figura 4.5 ilustra o que voc ver aps executar o mtodo mai nO.
FIGURA 4.5
TestaI/do o lIItodo
t oString() sobreposto.
Dia 4
Conforme voc pode ver na Figura 4.5, ThreeDimensionalPoint retorna sua representao de
String sobreposta.
Sobrepor um mtodo tambm conhecido como redefinir um mtodo. Redefinindo um mtodo, a filha
fomece sua prpria implementao personalizada do mtodo. Essa nova implementao fomeccr um
comportamento novo para o mtooo. Aqui , ThreeDimensionalPoint redefine o comportamento do
mtooo toStri ngO, para que ele seja correlamente transfonnado em um objeto String.
Novo TERMO
Sobrepor O processo de uma filha pegar um mtodo que aparece na progenitora e
reescrev lo para mudar o comportamento do mtodo. A sobreposio de um mto
do tambm conhecida como redefinio de um mtodo.
Ento, como o objelo sabe qual definio deve usar?
A resposta depende do sistema 00 subjacente. A maiori a dos sistemas 00 procurar primei ro a
defini o no objeto para o qual passada a mensagem. Se uma defi nio no for encontrada l. o
ambiente em tempo de execuo percorrer a hierarquia, at que uma defi nio seja encont rada.
importante perceber que assim que uma mensagem manipulada e que por isso que a so-
breposio funciona. A definio da filha ser a primeira a ser chamada, poi s a primeira encon-
trada. O mecanismo igual para mtodos e atributos recursivos, que veremos posteriorment e.
A Figura 4.6 ilustra a propagao de mtodo entre os objetos ponto para LIma chamada de get X-
Coordi nate (). Uma chamada de mtodo para getXCoord i na te () percorrer a hierarqui a at en-
contrar LIma defi ni o para o mtodo.
FIGURA 4.6
Pl'op(/ga(10 de
mellsagem emre
os objeto.f pomo.
5 D
5 D
I (Irl" d' -,1
, I
;/ o L ___ .....J;:;
L I
Herana: obtendo algo para nada 83
Ao considerarmos a sobreposio de um mtodo ou at ribul o, importante perceber que nem to-
dos os mtodos e atributos esto disponveis para sua filha sobrepor. A maioria das linguagens
orientadas a objelos tem alguma noo de controle de acesso. As palavras-chave controle de
acesso defi nem exatamente quem pode ver e acessar mtodos e atributos. Generi camente, esses
nveis de acesso caem em trs categorias, conforme discutido brevemente no Dia 2:
Privado: um nvel de acesso que restringe o acesso apenas classe.
Protegido: um nvel de acesso que restringe o acesso classe e s filhas.
Publico: lIm nvel de acesso que permite o acesso a todos e a qualquer um.
Os mtodos e atributos protegidos so aqueles aos quais voc deseja que apenas as subclasses te-
nham acesso. No deixe tais mtodos pblicos. Apenas aqueles com amplo conhecimento da
classe devem usar mtodos e at ributos protegidos.
Voc deve tornar privados todos os atributos no-constantes e qualquer mtodo destinado unica-
mente prpria classe. O nvel privado impede que qualquer outro objeto chame o mtodo, ex-
ceto quanto ao prprio objeto. No torne protegidos os mtodos privados, apenas para o caso de
alguma subclasse querer acess-los algum dia. Use o nvel protegido apenas para os mtodos
que voc sabe que uma subclasse deseja usar. Caso contrrio, use o nvel privado ou pblico. Tal
prtica rgida significar que talvez voc tenha de voltar ao seu cdigo posteriormente e mudar o
nvel de acesso de um mtodo. Entretanto, isso leva a um proj eto mais conciso do que um que
abra tudo para uma subclasse.
NOTA
Vollar e mudar niveis de acesso pode parecer uma prtica ruim. Entretanto, as
hierarqui as de herana nunca devem acontecer por acidente. Em vez disso, as
hierarquias devem ser desenvolvidas naturalmente, enquanlO voc programa.
No h vergonha em refazer suas hierarquias com o passar do tempo. A POO
real um processo iterativo.
Contudo, lembre-se de que tornar tudo privado uma regra geral . Existem ca-
sos em que esse consel ho no funcionar a seu favor . Tudo depende do que
voc estiver programando. Por exemplo, se voc vender bibliotecas de classe
genricas sem fornecer o cdigo-fonte, provavelmente dever ter o nvel pro-
tegido como padro, para que seus clientes possam usar herana para esten-
der suas classes.
Na verdade, existem ocasies em que voc desejar projetar uma subclasse
com a herana em mente. Em tal caso, faz senti do estabelecer um protocolo de
herana. Um protocolo de herana uma estrutura abstrata, vislvel apenas
atravs dos element os protegidos da classe. A classe progenitora chamar es-
ses mtodos e a classe filha poder sobrepor esses mtodos para aumenlar o
comportamento. Voc vai ver um exemplo assim, amanh.
Usando essas definies e regras, fcil ver que os mtodos e atri butos protegidos e publicos
so os mai s importantes para a herana.
Dia 4
Novos mtodos e atributos
Um novo mtodo ou atributo um mtodo ou atributo que aparece na fil ha, mas no aparece na
progenitora. A filha acrescenta o novo mtodo ou atributo em sua interface. Voc viu novos m-
todos no exemplo ThreeDimens ional Poi nt . ThreeDimensiona I Poi nt acrescenta os novos mta-
dos getlCoordinate() e setZCoordinateO. Voc pode adicionar nova funcionalidade na
interface de sua fi lha, adicionando novos mtodos e at ri butos.
Mtodos e atributos recursivos
Um mtodo ou at ri buto recursivo definido na progenitora ou em alguma outra ancestral, mas
no na fi lha. Quando voc acessa o mtodo ou atributo, a mensagem enviada para cima na hie-
rarquia, at que uma definio do mtodo seja encontrada. O mecanismo igual quele apresen-
tado na seo sobre mtodos e atributos sobrepostos.
Voc viu mlodos recursivos no cdigo-fonte de TwoDi mens i ona I Poi nt e ThreeDi mens i ona 1 Po-
i nt. getXCoord1 na te () um exemplo de mtodo recursivo, pois ele definido por TwoDimens i-
onal Point e no por ThreeDimensiona 1 Poi nt.
Os mtodos sobrepostos tambm podem se comportar de forma recursiva. Embora um mtodo
sobreposto aparea na filha, a maioria das linguagens orientadas a objetos fornece um mecanis-
mo que permite a um mtodo sobreposto chamar a verso da progenitora (ou de algum outro an-
cestral) do mtodo. Essa capacidade permite que voc enfat ize a verso da superclasse, enquant o
define novo comportamento na subclasse. Na linguagem Java, a palavra-chave super d acesso
implementao de uma progeni tora. Voc ter a chance de usar super nos laboratrios do Dia 5,
"Herana: hora de escrever algum cdigo".
NOTA
Nem todas as tinguagens fornecem a palavra-chave super. Para essas lingua-
gens, voc precisar tomar o cuidado de iniciali zar corretamente qualquer c-
digo herdado.
No referenciar corretamente as classes herdadas pode ser uma fonte sutil de
erros.
Tipos de herana
Ao todo, existem trs maneiras principais de usar herana:
I. Para reutilizao de implementao
2. Para diferena
3. Para substituio de tipo
Herana: obtendo algo para nada
Esteja avisado de que alguns tipos de reutilizao so mais desejveis que outros! Vamos explo-
rar cada uso em detalhes.
Herana para implementao
Vocj viu que a herana possibil ita que lima nova classe reuti lize implementao de outra clas-
se. Em vez dc recortar e colar cdigo ou instanciar e usar um componente atravs de composi-
o, a herana torna o cdigo automaticamente disponvel, como parte da nova classe. Como
mgica, sua nova classe nasce com funcionalidade.
A hierarquia Emp 1 oyee e a mal gui ada Queue/ Itera tar demonstram a reutil izao de i mplemen-
tao. Nos dois casos, a filha reut ili zou vrios comportamentos encont rados na progenitora.
DI CA
Lembre-se de que, quando programa com herana de implementao, voc
est preso implementao que herda. Escolha as classes que herdar com
cuidado. Voc precisar ponderar as vantagens da reutilizao em relao a to-
dos os faiaS negativos de reutilizar algumas implementaes.
Entretanto, uma classe corretamente def inida para herana far bastante uso
de mtodos protegidos refinados. Uma classe que herda pode sobrepor esses
mtodos protegidos para alterar a implementao. A sobreposio pode dimi -
nuir o impact o da herana de uma implementao mal feita ou inadequada.
Problemas da herana da implementao
At aqui, a herana de implementao parece excelente. Cuidado, contudo - o que parece lima
tcni ca til na superficie se mostra uma prtica perigosa no uso. Na verdade, a herana de imple-
mentao ti fonna mais defici ent e dc herana e nonnalmenle voc deve evit-Ia. A reutilizao
pode ser fcil , mas, conforme voc ver, ela tem um alto preo.
Para entender as fal has, voc precisa cons iderar os tipos. Quando uma classe herda de oulra, ela
assume automaticamente o tipo da classe herdada. A herana de tipo corret o sempre deve ter
precedncia, ao se projetar hierarquias de classe. Voc ver os motivos posteriormente, por en-
quant o, assuma isso como verdade.
D uma olhada no exemplo Queue/ lterator novamente. Quando Iterator herda de Queue,
ela se torna uma Queue. Isso significa que voc pode tratar Iterator como se fosse do tipo
Queue. Como Iterator tambm uma Queue, ela tem toda a funcionalidade que estava pre-
sente na Queue. Isso significa que os mtodos como enqueueO e dequeue() tambm fazem
parte da interface pblica de Iterator.
Superficia lment e, isso no parece ser um problema, mas d uma olhada melhor na definio de
Iterator. Uma interface Iterator simplesmente defi ne dois mtodos, um para recuperar um
elemento e outro para testar se restam quaisquer elementos no I terador. Por definio, voc no
pode adicionar itens em um Iterador; entretanto, Queue define o mtodo enqueue() justamente
Dia 4
para um caso assim. Em vez disso, voc s pode remover element os. Voc no pode pegar um
elemento e, ao mesmo tempo, deix-lo dentro da interface I terator. Novamente, Queue define o
mtodo peek () ,j ustamente para esse caso. E simples ver que usar Queue como uma base herdada
para I terator no uma boa escol ha; isso fornece comportamentos que si mplesmente no per-
tencem a uma interface Iterator.
NOTA
Algumas linguagens permitem que uma classe simplesmente herde imple-
mentao, sem herdar as informaes de tipo. Se sua linguagem permite tal
herana, ento o exemplo Queue/I terator no muito problemtico. Entretan-
to, a maioria das linguagens no permite a separao de interface e implemen-
t ao, durante a herana. Das linguagens que fazem a separao, algumas
fazem isso automaticamente. Outras ainda, como C++, permitem a separao,
mas exigem que o programador a solicite expli citamente. Tal linguagem exige
que o programador projete e solicite a separao explicitamente, enquanto co-
difica a cl asse. Obviamente, pode ser muito fcil ignorar o fato de que voc
precisar separar a implementao e o t ipo, se no tomar cuidado.
Este livro usa uma definio de herana simples. A discusso sobre herana
pressupe que ela inclui implementao e interface, quando uma classe herda
de outra.
Uma herana pobre o monstro de Frankenstein da programao. Quando voc usa herana uni-
camente para reutil izao de implementao, sem quaisquer outras consideraes, freqUente-
mente pode acabar com um monstro construido a partir de partes que no se encaixam.
Herana para diferena
Voc viu a herana para diferena no exemplo de TwoOimens i onal Point e ThreeOimensional Po -
int. Voc tambm a viu no exemplo Employee.
A programao peta diferena permi te que voc programe especificando apenas como uma clas-
se filha difere de sua classe progenitora.
Novo TERMO
Programa(:t;o por diferena significa herdar uma classe e adicionar apenas o cdigo
que tome a nova classe diferente da classe herdada.
No caso de Th reeOimens i ona 1 Po int, voc v que ela difere de sua classe progenitora pelo acrs-
cimo de uma coordenada Z. Para suportar a coordenada Z, ThreeOimens i onal Poi nt adiciona dois
novos mtodos para configurar e recuperar o atribut o. Voc tambm v que ThreeOimens f ona1-
Point redefine o mtodo toStringO.
A programao por di ferena um conceito poderoso. Ela permite que voc adicione apenas o
cdigo necessrio o suficiente para descrever a diferena entre a classe progenitora c a classe fi -
lha. Isso permite que voc programe atravs de incrementos.
Herana: obtendo algo para nada
Um cdigo menor e mais fcil de gerenciar toma seus projetos mais simples. E como voc pro-
grama menos li nhas de cdigo, teoricamente deve introduzir menos erros. Assi m, quando pro-
grama pela diferena, voc escreve cdigo mais correto em um espao de tempo mais curto.
Assi m como a herana de implementao, voc pode fazer essas al teraes increment ais sem al -
terar o cdigo existente.
Atravs da herana, existem duas maneiras de programar pela diferena: adicionando novos
comportamentos e atributos. e redefini ndo comportamentos c atributos antigos. Cada caso co-
nhecido como especializao. Vamos ver detalhadamente a especial izao.
Especializao
Novo TERMO
Especializao O processo de uma classe filha ser projetada em tennos de como ela
diferent e de sua progenitora. Quando tudo estiver dito e feito, a definio de classe
da filha incluir apenas os elementos que a tomam diferente de sua progenitora.
Uma classe fil ha se especializa em relao sua progenitora, adicionando novos atributos e m-
todos em sua interface, assim como redefinindo atributos e mtodos previamente existentes. A
adio de novos mtodos ou a redefinio de mtodosj existentes permite que a filha expresse
comportamentos que so diferentes de sua progenitora.
No se confunda com o tenno especiali zao. A especializao permite apenas que voc adicio-
ne ou redefina os comportamentos e atributos que a fil ha herda de sua progeni tora. A especiali-
zao, ao contrri o do que o nome possa sugerir, no permite que voc remova da fi lha
comportamentos e atri butos herdados. Uma classe no obtm herana seletiva.
O que a especial izao faz rest ri ngir o que pode e o que no pode ser um ponto tridimensional.
Um ThreeOimensiona 1 Point sempre pode ser um TwoDimensional Point. Entretanto, incorreto
dizer que um TwoDimensi onal Poi nt sempre pode ser um ThreeDimensional Point.
Em vez di sso, um ThreeDimensiona 1 Poi nt uma especializao de um TwoDimensional Poi nt e
um TwoOimens ionalPoint uma generali zao de um ThreeDimensionalPoint.
A Figura 4.7 i lustra a di ferena entre general izao e especial izao. Quando voc percorre uma
hierarquia para baixo, voc se especial iza. Quando voc percorre uma hierarquia para cima,
,
voc generaliza. A medida que voc generaliza, mais classes podem cair sob esse agrupamento.
,
A medida que voc especiali za, menos classes podem sati sfazer todos os critrios para serem
classi ficadas nesse nvel.
FIGURA 4.7
Quando percorre /filia
hierarquia para cima.
\'oc gellerali: a. Qllalldo
perco,.re lima hierarqllia
para boi.to. !"oc
especia!i:a.
Dia 4
Como voc v. especializao no signi fica uma restrio de funcionalidade, ela significa restri-
o da categori zao de tipo. A especializao no precisa acabar com ThreeOi mens; ona 1 Poi nt.
Na verdade, ela no precisa necessariamente nem mesmo comear com TwoOi mens i ona 1 Poi nt. A
herana vai ter a profundidade que voc quiser. Voc pode lIsar herana para formar estruturas
de hierarquia de classe complexas. A noo de hierarquia int roduzida anteriormente leva a mais
dois termos novos: Gnceslral e descendente.
NOTA
Apenas porque voc pode ter hierarquias compli cadas no significa que deve
t-Ias. Voc deve se esforar por ter hierarquias pouco profundas e no hierar-
quias demasiadamente profundas. medida que uma hierarquia se aprofun-
da, ela se torna mais difcil de manter.
Novo TERMO
Dada alguma filha, uma ances/ral uma classe que aparece na hierarquia de classes
antes da progenitora. Conforme a Figura 4.8 il ustra, Format uma ancestral de Oeci-
mal Format .
Novo TERMO
Dada lima classe, toda classe que aparece depois dela na hierarquia de classes uma
descendellle da classe dada. Conforme a Figura 4.8 ilustra, Oec i mal Format uma
descendente de Fermat.
FIGURA 4.8
OecimolFormat
desceI/deli/e de
Formot.
Formal
NumberFormat
-'-
ChoiceFormlll OecimalFormlll
Herana: obtendo algo para nada 89
Digamos que tivssemos a hierarquia de herana de classes mostrada na Figura 4.9. Dizemos
que OneDl mensional Point a progenitora de TwoDimensional Point e ancestral de ThreeDimen-
si onalPoint e de FourOimensionalPoint. Tambm podemos dizer que TwoDimensionalPoint,
ThreeDi mens i ona 1 Poi nt c FourOi mens i ona 1 Pai nt so todas descendentes de OneOimens i ona 1 -
Pa int. Todos os descendentes companil ham os mtodos e atributos de seus ancestrais.
FIGURA 4.9
II hierarqllia
de pallfo.
I . ~ ~ ~ M I ... ___
1 TwoOI......w ..... PoI'" I.
4 TII ... Di ...... 1 .... IPo!m 1'41 I
1 F ..... .oimI_ .. ~
Podemos fazer mais algumas declaraes interessantes sobre a hierarquia de classes. OneDimen-
sianalPoint a rai z e FaurOi mensionalPaint uma folha.
Novo TERMO
NovO TERMO
A c/euse raiz (tambm referida comum ente como classe base) a classe superior da hi-
erarquia de herana. A Figura 4.9 mostra que OneOimens i ona 1 Poi nt uma classe raiz.
Uma c/(I.uefolha uma classe sem filhas. Na Figura 4.8, Decimal Format uma clas-
se fol ha.
imponantc notar que as descendentes refl etiro as alteraes feitas nas ancestrais. Digamos
que voc encontre um erro em TwoOimens i ona 1 Point. Se voc corrigir TwoOimensional Point, to-
das as classes de ThreeOimens i ona 1 Poi nt at FourOi mens i ona 1 Poi nt tiraro provei to da altera-
o. Assim, se voc corri gi r um erro ou tomar lima implement ao mais efi ciente, todas as
classes descendentes da hierarquia tiraro proveito disso.
Herana mult ipla
Em todos os exemplos voc viu herana simples. Algumas implementaes de herana
permitem que um objeto herde di reta mente de mais de uma classe. Tal implementao
de herana conhecida como herana mltipla. A herana mltipla um aspecto con-
troverso da POO. Atguns dizem que ela s torna o software mais diflcil de entender, pro-
jetar e manter. Outros tm grande confiana nela e dizem que uma linguagem no est
completa sem ela.
De qualquer modo, a herana mltipla pode ser valiosa, se usada cuidadosa e correta-
ment e. Existem vri os problemas introduzidos pela herana mlti pla. Entretanto, uma
discusso completa do que a herana mltipla pode e no pode fazer est fora dos obje-
tivos deste dia.
Dia 4
Herana para substitui o de tipo
o tipo fina l de herana a herana para substi tuio de tipo. A substitui o de tipo penni te que
voc descreva relacionamentos com capacidade de subst ituio. O que um rel acionamento
com capacidade de substituio?
Considere a classe li ne:
publi c class l i ne (
}
private TwoOimens i ona lPoi nt pI :
private TwoOimensionalPoint p2:
publiC Li ne( TwoDimensionalPoi nt pI, TwoDimensionalPoint p2 ) (
thi s.pl pI:
this.p2 p2:
)
publ ic TwoDimensionalPoint getEndpoi nt l() {
return pI:
}
publi c TwoDi mensionalPoint getEndpoi nt2() {
return p2:
publ ic double getDistanceO I
doubl e x
}
Math.pow( (p2.getXCoordinate( ) pl.getXCoordinate( , 2 );
doubl e y
Math.pow( (p2.getYCoordinate() - pl . getYCoordinate(, 2 ) ;
doubl e di st ance Math. sqrt( x + y ) ;
return di stance :
public TwoDi mensional Poi nt getMidpoint () I
}
double new_x (p l . ge t XCoordinate() + p2 .getXCoordinate() ) / 2;
double new_y (pl .get YCoordinate() + p2 .getYCoordinate() ) / 2:
ret urn new TwoOimensionalPoi nt ( new_x . new_y ) :
}
Li ne recebe dois objetos TwoDimensional Poi nt como argumentos e fornece alguns mtodos para
recuperar os valores, um mtodo para calcular a distncia entre os pontos e um mtodo para cal-
cular o ponto mdi o.
Um relacionamento com capacidade de substi tuio significa que voc pode passar para o cons-
trutor de l ine qualquer objelo que herde de TwoDimensional Point.
Herana: obtendo algo para nada 91
Lembre-se de que, quando uma filha herda de sua progenitora, voc di z que a filha ' uma' pro-
genitora. Assim, como um objclo ThreeOimens iona 1 Poi nt ' um' objeto TwoDimensional Poi nt,
voc pode passar um objeto ThreeDimensiona 1 Poi nt para o construtor.
Considere o mtodo mainO a seguir:
publi c sta tic void main( Str ing [] args } I
I
ThreeDimensionalPoint pi = new ThreeDimensionalPoint( 12, 12, 2 };
TwoDimensional Point p2 z new TwoDimensionalPoint( 16 , 16 );
Line 1 z new Line( pi, p2 );
TwoOimensi onalPoint mi d = 1. ge tMidpoint() ;
System.out.println( "Midpoint: (" +
mid.getXCoordinate() +
" " +
mid.getYCoordinate() +
"l" );
System.out.println( "Distance:" + l.getOistanceO );
Voc notar que o mtodo principal passa um objeto TwoDi mens ional Poi nt e um objeto Th ree-
Dimens iona 1 Poi nt para o construtor de L i ne. A Figura 4.1 O iI ustra o que voc ver, se executar o
mtodo mainO.
FIGURA 4.10
Tes/(mdo re/aciollamelllos
com capacidade de
.mbslillli{i o.
NOTA
Tente imaginar as possibilidades que os relacionament os com capacidade de
substituio oferecem a voc. No exemplo da linha, eles poderiam possibili tar
uma maneira rpida de trocar de um modo de visualizao em 3D para um
modo de visualizao em 20 em uma GU!.
Capacidade de conexilo um conceito poderoso. Como voc pode enviar a uma filha qualquer
mensagem que pode ser enviada para sua progenitora, passiveI trat-Ia como se ela pudesse ser
Dia 4
substi tuda pela progenitora. Esse o moti vo pelo qual voc no deve remol/er comport amentos
ao criar uma fil ha. Se voc fizer isso, a capacidade de conexo ser invalidada.
Usando a capacidade de conexo, voc pode adicionar novos subtipos em seu programa, a qual
quer momento. Se seu programa for feito para usar uma ancestral, ele saber como usar os novos
obj etos. O programa no precisar se preocupar com o ti poexato do obj eto. Desde que tenha um
relacionamento com capacidade de substit uio com o ti po que espera que possa usar.
ALERTA
Saiba que os relacionamentos com capacidade de substituio s6 podem ir at
um n(vet acima na hierarquia de herana. Se voc programar seu obj eto para
aceitar determinado tipo de objeto, no poder passar para ele a progenitora
do objeto esperado. Entretanto, voc pode passar para ele qualquer descen-
dente.
Pegue como exemplo o construtor de Une:
public Line( TwoDimensionalPoint pl,TwoDimensionalPoint p2 )
Voc pode passar para o construtor um objeto TwoDemenslonalPoint ou qualquer
descendente de TwoDimens i ona 1 Po i nt . Entretanto, voc no pode passar para o
const rutor um objeto OneDimensionalPoint, pois essa classe aparece antes de
TwoDimensionalPoint na hierarquia.
Novo TERMO Um slIbtipo um ti po que estende outro tipo atravs de herana.
A capacidade de substit uio aumenta sua oport unidade de reutil izao. Digamos que voc te-
nha escrito um pacote para conter obj etos TwoDirnens i ona 1 Poi nt. Devido a capacidade de cone-
xo, voc tambm pode usar o pacote para qualquer descendente de TwoOirnens ional Poi nt.
A capacidade de subst it uio importante, pois ela pennite que voc escreva cdigo genrico.
Em vez de ter vri as instrues case ou testes if/else para ver que ti po de ponto O programa eSla-
va usando, voc si mplesmente programa seus objetos para tratar com objetos do tipo TwoOimen
si ona 1 Poi nt.
Dicas para a herana eficaz
A herana vem com seu prprio conjunto de problemas de projeto. Embora seja poderosa, na
verdade a herana fornece a corda para voc se enforcar, quando usada incorretamente. As dicas
a seguir o ajudaro a usar a herana eficazmente:
Em geral, use herana para reutilizao de interface e para definir relacionamentos de
substituio. Voc tambm pode usar herana para estender uma implementao, mas 50--
mente se a classe resultante passar no teste ' um' .
Em geral, prefira a composio em vez da herana para reut ili zao de implementao
simples. Use herana apenas se voc puder apl icar o teste ' um' na hierarquia resultante.
No use herana para reutilizao de implementao ambiciosa.
Scmpre use a regra ' um'.
Herana: obtendo algo para nada
As hierarquias de herana corretas no acontecem sozinhas. Freqlientemente, voc descobrir
hierarquias medida que prosseguir. Quando isso acontecer, refaa seu cdigo. Em outras oca-
sies, voc precisar projetar deliberadament e suas hierarquias. De qualquer modo, existem al-
guns princpios de projeto a seguir:
Como regra gera l, mantenha suas hi erarquias de classe relat ivament e rasas.
Projete cui dadosamente a hierarquia de heranas e remova as caractersticas comuns das
classes base abstratas. As classes base abstraIas pennilem que voc defina um mtodo
sem fornecer uma implementao. Como a classe base no especi fica uma implementa-
o, voc no pode instanci-Ia. Ent retant o, o mecanismo abstraio obri ga uma classe que
esteja herdando a fornecer uma implementao. As classes abstratas so valiosas para he-
rana planejada. Elas ajudam o desenvolvedor a ver o que elas precisam implementar.
NeTA
Se sua linguagem no fornece um mecanismo abstrato. cri e mtodos vazios e
documente o fat o de que subclasses devem implementar completamente es-
ses mtodos.
As classes freqUentemente compartilham cdigo COmum. No h sentido em ter vrias
cpias de cdigo. Voc deve remover o cdigo comum e isol-lo em uma (mica classe
progenitora. Entretanto, no o coloque muito aci ma. Coloque-o apenas no primeiro nvel
acima de onde ele necessri o.
Simplesmente no possvel planejar sempre suas hierarquias completamente. As carac-
tersticas comuns no aparecero at que voc escreva o mesmo cdigo algumas vezes.
Quando voc ver caracterst icas comuns, no tenha medo de refazer suas classes. Esse
trabalho freqlentemente referido como refazer.
O encapsulamento to important e ent re progenitora e filha quanto entre classes no relaciona-
das. No relaxe quanto ao encapsulamento, quando voc estiver herdando. A prti ca de usar uma
interface bem definida to vl ida entre progenitora e fi lha quanto entre classes completamente
no relacionadas. Aqui esto algumas dicas que o aj udaro a evit ar a quebra do encapsulamento,
quando voc herdar:
Use interfaces bem definidas entre a progenitora e a fi lha, exatamente corno as usaria en-
tre classes.
Se voc adicionar mtodos especificamente para uso por subclasses, certifique-se de tor-
n-los protegidos, para que apenas a subclasse possa v-los. Os mtodos protegidos per-
mitem que voc oferea s suas subclasses um pouco mai s de controle, sem abrir esse
cont role para toda classe.
Em geral , evite abrir a implementao interna de seu objeto para subclasses. Uma sub-
classe pode se tomar dependente da implementao, se voc fi zer isso. Tal acoplamento
tem todos os problemas delineados no Dia 2.
Aqui esto alguns segredos fi nais para a herana eficaz:
Dia 4
Nunca se esquea de que a substituio o objet ivo nmero um. Mesmo que um objeto
deva ' intuit ivamente' aparecer em uma hierarquia, isso no quer di zer que ele deve apare-
cer. Apenas porque possvel ou porque sua intuio clama, no significa que voc deve
fazer isso.
Programe pela di ferena para manter o cdi go fcil de gerenciar.
Sempre prefira a composio herana para reutilizao de implementao. Geralmente
mais fcil alterar as classes envolvidas na composio.
Resumo
Existem dois tipos de relacionamentos fornecidos pela POO: um relacionamento de /(so entre
objetos e um relacionamento de herana entre classes. Cada relacionamento fornece urna forma
de reutili zao. Entretant o, cada um vem com suas prprias vantagens e problemas.
A simples instanciao e uso freqUentemente limitam a nexibilidade de uma classe. Atravs da
reutili zao simples, no h meios de reut il izar ou estender uma classe. Em vez disso, voc fica
com uma instanciao simpl es ou recorte e colagem. A herana supera essas defi cincias, forne-
cendo um mecanismo interno para a reutil izao segura e eficiente do cdigo.
A reuti lizao de implementao proporciona a voc um modo rpido e grosseiro de usar cdigo
previamente existente em suas novas classes. Ao cont rri o da operao de recorte e colagem
simples. existe apenas uma cpia do cdigo para manter. Entretanto, simplesment e herdar para
reuti li zar imprevi dente e limita seus projetos.
A implement ao para diferena permite que voc programe suas novas classes em termos de
como el as diferem da classe original. Voc s programa os atributos que diferenciam a filha da
progenitora.
Finalmente, a herana para substituio penni te que voc programe genericamente. Com a subs-
tituio, voc pode trocar de subclasses para a progenitora a qualquer moment o, sem dani ficar
seu cdigo. Isso permite que seu programa seja flexvel para futuros requisitos.
Como a herana atende aos objetivos da 00
A herana preenche cada um dos objelivos da POO. Ela ajuda a produz ir software que :
i. Natura l
2. Confivel
3. Reutili zvel
4. Manutenvel
5. Extensvel
6. Oportuno
Herana: obtendo algo para nada
Ela atinge esses objetivos, como segue:
o Natural: a herana permite que voc modele o mundo mais naturalrnente. Atravs da heran-
a, voc pode fonnar hierarquias de relacionamento complexas entre suas classes. Como
seres humanos, nossa tendncia natural querer categorizar e agrupar os objetos que esto
em tomo de ns. A herana pennite que voc traga essas tendncias para a programao.
A herana tambm abrange o desejo do programador de evitar trabalho repetitivo. No
faz sentido fazer trabalho redundante.
Confivel: a herana resulta em cdigo confivel.
A herana si mplifi ca seu cdigo. Quando programa pela diferena, voc adiciona apenas
o cdigo que descreve a diferena entre a progenit ora ea filha. Como resultado, cada clas-
se pode ter cdigo menor. Cada classe pode ser altamente especializada no que faz. Me-
nos cdi go significa menos erros.
A herana permite que voc reuti li ze cdigo bem testado e comprovado, como a base de
suas novas classes. A reutilizao de cdigo comprovado sempre mais desejvel do que
escrever novo cdigo.
finalmente, o mecanismo de herana em si confivel. O mecani smo incorporado lin-
guagem, de modo que voc no precisa construir seu prprio mecanismo de herana e
cert ificar-se de que todo mundo segue suas regras.
Entretanto, a herana n1l0 perfeita. Ao usar subclasses, voc deve estar vigi lante com re-
lao introduo de erros sutis destruindo inadvertidamente dependncias no expostas.
Prossiga com cuidado, quando herdar.
Reutilizvel: a herana auxilia a reuti lizao. A prpria natureza da herana permite que
voc use classes antigas na construo de novas classes.
A herana tambm perrn it e que voc reuti li ze classes de maneiras nunca imaginadas pela
pessoa que escreveu a classe. Sobrepondo e programando pela diferena, voc pode alterar
o comportamento de classes existentes e us-las de novas maneiras.
o Manuten vel: a herana auxil ia a manutenibil idade. A reuti !izao de cdigo testado sig-
nifica que voc ter menos erros em seu novo cdigo. E quando voc encontrar um erro
em uma classe, todas as subclasses tiraro proveito da correo.
Em vez de se aprofundar no cdigo e adicionar recursos diretamente, a herana permite
que voc pegue cdigo previamente existente e o trate como a base da construo de uma
nova classe. Todos os mtodos, atributos e infornlacs de tipo se tomam parte de sua
nova classe. Ao contrrio do recorte e colagem, existe apenas uma cpia do cdigo origi-
nal para manter. Isso ajuda na manuteno, di minuindo a quantidade de cdigo que voc
precisa manter.
Se voc fosse fazer alteraes diretamente no cdigo existente, poderia danificar a classe
base e afetar partes do sistema que usem essa classe.
196 Dia.
Extensvel: a herana torna a extenso ou especializao de classe possvel. Voc pode
pegar uma classe antiga e adicionar nova funcionalidade a qualquer momento. A progra-
mao pela diferena e a herana para capacidade de conexo est imulam a extenso de
classes.
Oportuno: a herana o aj uda a escrever cdigo oport uno. Voc j vi u como a reutili zao
simples pode di mi nuir o tempo de desenvolvimento. Programar pela diferena signi fi ca
que existe menos cdigo para escrever; portanto, voc deve terminar mais rapidamente.
Capacidade de substituio significa que voc pode adicionar novos recursos, sem ter de
alterar muito o cdigo j existente.
A herana tambm pode tornar os testes mais fceis, pois voc s precisa testar a nova
funcionalidade e qualquer interao com a funci onalidade antiga.
Perguntas e respostas
P Hoje, foram li stados trs motivos separados para usar herana. Esses motivos pre-
cisam ser mutuamente exclusivos ou posso combin-los? Por exemplo, quando eu
herdo pela diferena, parece que tambm poderia herdar para implementao.
R No, os moti vos por trs da herana no precisam ser mutuamente exclusivos. Voc po-
deria usar herana e acabar sati sfazendo cada um dos mot ivos.
P Herdar para reutilizao de implementao parece ter uma conotao negath'a. A
reutilizao mio um dos principais motivos para se usar programao orientada a
objetos?
R A relllilizao apenas um dos objet ivos da roo. A roo uma estratgia de programa-
o que permite modelar as solues para seus problemas de uma maneira mais natural:
atravs de objetos. Embora a reut ilizao sej a importante, voc no deve simplesmente
busc-Ia, ignorando os outros objetivos da 00. Lembre do exemplo lterator/Queue.
Aquele era um model o natural de uma interface Iterator? claro que no!
Alm disso, a herana para reutilizao de implementao apenas uma maneira de obter a reu-
ti I izao. FreqUentemente, a delegao a melhor maneira de obter reuti lizao de impl ementa-
o simpl es. A herana si mplesmente no a ferrament a correta, se seu objeti vo apenas
reut ili zar uma implementao. A herana a ferramenta correta quando voc quer programar
pela diferena Oll estabelecer capacidade de substit uio de tipo.
Workshop
As perguntas e respostas do teste so fornecidas para seu melhor entendimento. Veja as respos-
tas no Apndice A, "Respostas".
Herana: obtendo algo para nada 97
Teste
I. Quais so algumas das li mitaes da reutilizao simples?
2. O que herana?
3. Quais so as trs formas de herana?
4. Por que a herana de implementao perigosa?
5. O que programao pela diferena?
6. Ao herdar uma classe, pode-se ter trs tipos de mtodos e atributos. Quais so esses trs
tipos dc atributos e mtodos?
7. Quai s vantagens a programao pela diferena oferece?
8. Considere a hierarquia da Figura 4.11 , extraida da segurana do Java.
FIGURA 4.11 P mluion
A hierarquia Permi ss i on.
B .. icP,rm;uion Un ...,r..edf'"miuion
Stc:urifvl'ermlulon
Se voc voltar sua ateno para a classe Pcnni ss i on, quais classes so suas !ilhas? Quais so des-
cendentes?
Consi derando a hierarquia int ci ra, qual classe a classe raiz? Quais classes so classes fol has?
Finalmente, Permission uma ancestral de SecurityPermission?
9. O que herana para substitui o de tipo?
10. Como a herana pode destruir o encapsulamento? Como voc pode impor o encapsula-
mento ao usar herana?
Exerccios
I. Dada a defini o da classe a seguir, quais problemas poderi am ocorrer, se ela fosse her-
dada?
publ lc class Point (
public Point( i nt x, i nt y) I
,
,
this . x x:
this.y "' y;
Dia 4
publ1c Po1nt getlocation{) {
return new POint( x, y ):
,
public void move( int x, i nt y ) {
thi s.x x;
this.y ., y;
,
public void setlocation( int x, int y ) {
this.x x
thiS.y .. y:
,
pub l ic void setlocation( Point p ) {
th;s.x = p.x;
this.y .. p.y:
,
public ;nt X;
public int y;
2. Como voc evitari a esses problemas?
SEMANA 1
DIA
Herana: hora de escrever algum
cdigo
A herana uma ferramenta poderosa. Hoje, voc vai explorar o uso dessa nova ferramenta,
atravs de vari os exerccios prticos de laboratrio. No final da liO de hoje, voc dever se sen-
tir um pouco mais vontade com a teoria apresentada no Dia 4.
Hoje voc aprender:
Corno usar herana enquanto programa
Como as classes abstraIas o ajudam a planejar a herana
Sobre a impOrlincia do relacionamento 'e um' e ;tem um'
o Como a linguagem Java pode ter violado os relacionament os ' um' e ' tem um'
laboratrio 1: herana simples
A Li stagem S. l apresenta a classe base MoodyObject personificada.
LI STAGEM 5.1 MoodyObject.java
public class MoodyObject (
II retorna o humor
protected String getMood() I
1 100 Dia5
LI STAGEM 5 . 1 MoodyObject.java (continuao)
}
return "moody" i
}
II pergunta ao objeto como ele se sente
public voi d queryHood() I
System.out.print ln("I feel " + getMood O + " today!")i
}
MoodyObject define um mtodo pblico: queryMood (). queryMood () imprime o humor do objeto
na linha de comando. MoodyObject tambm declara um mtodo protegido, getMood (). queryMood ()
usa getMood () internamente para obter o humor que coloca em sua resposta. As subclasses po-
dem si mplesmente sobrepor getMoodO para especializar seu humor.
Se uma subclasse qui sesse mudar a mensagem escrita na linha de comando, ela precisari a sobre-
por queryHood ().
Exposio do problema
Neste labomtrio, voc criar duas subclasses: SadObject e HappyObject. As duas subclasses devem
sobrepor getHood() para fornecerem seu prprio humor especialmente personal izado.
SadObject e HappyObject tambm devem adicionar alguns mtodos prpri os. SadObject deve
adicionar um mtodo: publ i c voi d cry(). Do mesmo modo, HappyObject deve adic ionar um
mtodo: pub 1 i c voi d 1 augh (). 1 augh () deve escrever ' hahaha' na linha de comando. Do mes-
mo modo, cry() deve escrever ' boa hoo' na linha de comando.
A Listagem 5.2 configura um driver de teste que voc deve compilar e executar quando tiver
concludo a escri la de HappyObject e SadObj ect.
LI STAGEM 5.2 MoodyOriver.java
publi c class MoodyOriver {
public f i nal static void ma in( String [] args ) {
MoodyObject moodyObject c new MoodyObject() i
SadObject sadObj ect new SadObject ();
HappyObject happyObject " new HappyObject( ) ;
System. out.print ln( -How does the moody object feel today?M ) i
moodyObject . queryMood()i
Sys t em. out . pr1nt l n( "" l i
Sys t em. out . print ln( "How does the sad object feel today?M )i
sadObjec t.queryMood( ); Il note que a sobreposi o muda o humor
SadObject.cry() ;
System.ouLprint ln( ,,- ) ;
Herana: hora de escrever algum cdigo
LI STAGEM 5.2 MoodyDriver. java (continuao)
J
J
System.out.print ln{ NHow does the happy object feel today?" );
happyObject . queryMood(); Ilnote que a sobreposi o muda o humo r
happyObject . laugh() ;
Sys t em.out .print l n( l ;
101
ALERTA
A prxima seo discute as solues do Laborat rio 1. No prossi ga at con-
cluir o Laboratri o 1.
Solues e discusso
As listagens 5.3 e 5.4 apresentam uma soluo para o laboratri o.
LI STAGEM 5.3 HappyObj ect.java
publ ic class HappyObject extends MoodyObject (
J
Ilredefine o humor da classe
protected String getMood() I
return "happy;
J
II especializao
pu bl ic voi d laugh () {
Sys tem. ou t. pri nt 1 n (" hehehe ... hahaha . .. HAHAHAHAHAHA! ! ! ! ! ") ;
J
LI STAGEM 5.4 SadObject .java
public class SadObjec t extends MoodyObject {
II redefine o humor da cl asse
protected String getMood() {
return "sad";
J
II especializao
publ ic voi d cryO I
1 102 Dia 5
LI STAGEM 5.4 SadObject.java (continuao)
System.out . println{"'wah' ' boo hoo' 'weep ' 'sob' ' weep'"};
}
}
Quando voc executar o driver de teste, dever ver uma sada semelhante a da Figura 5.1.
FIGURA 5.1
A saida correra de
MoodyDriver,
De interesse a chamada de queryMood(). Quando voc chama queryMood () em SadObject. " I
feel sad today!" impresso na tela. Do mesmo modo, HappyObject imprime, "1 fccl happy today!"
Tal comportamento pode parecer surpreendente, pois nenhuma classe redefi ne queryMood O.
Voc precisa ver queryMoodO detalhadamente. Internamente, queryMoodO chama getMoodO
para obter o humor. Como as subclasses redefinem getMoodO, queryMoodO chamar a verso
fi lha de getMood (). Esse comport amento um exemplo do processo ilustmdo na Figura 4.6 do
Dia 4.
laboratrio 2: usando classes abstratas para
herana planejada
Existi ro ocasies em que voc desejar desenvolver li ma classe especificamente para que ou-
tros possam herdar dela. Quando voc desenvolve algumas classes relacionadas, pode encontrar
cdigo que comum a todas as suas classes. A boa prtica diz que, ao ver cdigo comum, voc o
coloca em uma classe base. Quando voc escreve essa classe base, planeja para que outras clas-
ses herdem dela.
Ent retanto, uma vez que voc ti ver terminado de mover o cdigo, poder notar que no faz senti-
do instanciar a classe base di retament e. Embora a classe base contenha cdigo comum, que
Herana: ho ra de escrever algum cdigo 103
muito valioso para subclasses, ela pode no ter nenhum valor para instanciao e uso direto. Em
vez disso, s faz sentido usar as subclasses. As subclasses se especializam em relao classe
base e fornecem o que est faltando.
Considere a classe Employee:
publ i c cl ass Employee {
I
private String first_name ;
private String last_name;
private double wage ;
publi c Employee ( String first_name . St ring last name . double wage ) (
this.first_name f i rs t _name :
this.last _name last_name :
this.wage wage;
I
publ iC doubl e getWage() {
return wage:
I
publ iC String getFirstName() (
return first_name:
I
public String getLastName() (
return l ast_name:
I
publ ic double calculatePay() (
II No sei como fazer isso !
return O;
I
publiC Stri ng print Paycheck() {
I
String full_name " l ast_name + " , " + fi r st_name ;
ret urn ( "Pay: " + full name + " $" + cal culatePay() );
Voc pode usar Empl oyee como classe base de Conmi ss i onedEmp loyees, HourlyEmployees e Sa-
l ariedEmp loyees. Cada subclasse sabe como calcular seu pagament o. Entretanto, o algoritmo
usado para calcular pagamento vai variar de acordo com o tipo de funcionrio. Quando cri a-
mos essa hierarquia, imaginamos que cada subclasse preci saria definir seu prprio mtodo
cal cul atePayO.
Dia 5
H um pequeno problema: Empl oyee no tem nenhuma regra para calcular seu pagamento. No
faz sentido executar calculatePayO para um objeto Employee. No existe nenhum algoritmo
para calcular o pagamento de um runcionrio genrico.
Uma soluo no defini r cal culatePayO na classe base. Entretanto, no defi ni r o mtodo na
classe base seri a uma deciso inreliz. Isso no modela um runcionri o muito bem. Cada runcio-
nri o saber calcular seu pagament o. A nica diferena a implementao real do mtodo ca 1-
culatePayO. Assim, na verdade, mtodo pertence classe basco
Se voc no definir ca 1 cul atePayD na cl asse base, no poder tratar os runcionrios generica-
mente. Voc perder a capacidade de conexo de subtipo para o mtodo ca 1 cul atePay (). Ou-
tra soluo simplesment e codificar um retorno en latado. O mtodo poderia simpl esmente
retornar wage.
Um retorno codificado no uma soluo muito limpa. No h garantias de que outro dcsenvolvc-
dor v se lembrar de sobrepor o mtodo, ao desenvol ver uma nova subclasse. Alm disso, no raz
nenhum sentido instanciar um objeto Emp loyee. Felizmente, a 1'00 oferece um tipo especial de
classe, desl'inada especificamente herana planejada: a classe abstrata.
Uma classe abstrata mui to parecida com qualquer outra definio de classe. A defi nio da
classe pode definir comportamentos e atributos, exatamente como uma classe normal. Entretan-
to, voc no pode instanciar diretamente uma classe abstraIa, pois uma classe abstrata pode dei-
xar alguns mtodos indefinidos.
Novo TERMO
Um mtodo declarado, mas no implemelllado, chamado de melOdo absl NIIQ. So-
mente classes abstraIas podcm tcr mtodos abstratos.
Em vez di sso, voc pode instanciar apenas as descendentes da classe abstrata que realmente im-
plementam os mtodos abstraIaS.
Vamos ver uma classe Employee abstraIa:
public abstract cl ass Empl oyee (
publiC abstract double calculatePay{) ;
II o restante da definio permanece igual
I
A classe abslrata Emp 1 oyee defi ne um mtodo ca 1 cu 1 a tePay () ; entretanto, ela o deixa indefi nido.
Agora, fica por conta de eada subclasse implementar realmente o mtodo. HourlyEmpl oyee
uma dessas subclasses:
public class Hour lyEmployee extends Emp l oyee {
private i nt hours ; Ilcontrola o nmero de horas trabalhadas
public HourlyEmpl oyee ( Str i ng f lrst_name, String last_name. double wage ) {
supe r ( flrst _name. l ast_name. wage };
}
Herana: hora de escrever algum cdigo
}
publiC double calculatePay() I
return getWage{) * hours;
}
publi c void addHours( i nt hours ) I
this . hours thiS.hours + hours;
}
public void resetHours() {
hours O;
}
105
Declarando mtodos abstratos, voc obriga suas subclasses a se especial izarem em relao
classe base, fornecendo uma implementao para os mtodos abst ratos. Tornando uma classe
base abstrata e criando mtodos abstratos, voc planeja com antecipao o que a subclasse deve
redefi nir.
Exposio do problema
No Laboratrio 1, voc criou uma classe MoodyObject. Todas as subclasses redefinem getMo-
od (). Para o Laboratrio 2, altere um pouco essa hierarquia. Torne o mtodo gctMood()abstrato.
Voc tambm precisar atualizar a classe MoodyDriver para que ela no tente mais instanciar Mo-
odyObject diretamenle. Voc no ter de fazer quaisquer alteraes em SadObject ou
HappyObject, pois elas j fornecem uma implementao de getMoodO.
A prxima seo discute as solues do Laboratrio 2. No prossiga at con-
cluir o Laboratrio 2.
Solues e discusso
As li stagens 5.5 e 5.6 apresentam as definies de MoodyObj ect e MoodyDri ver reestruturadas.
LI STAGEM 5.5 MoodyObject .java
public classe abstrata MoodyObject I
II retorna o humor
protected abstract Stri ng getMood();
II pergunta ao objeto como ele se sente
public void queryMood() I
1 106 Dia5
LI STAGEM 5.5 MoodyObject .java (cont inuao)
System.out.println{"I feel N + getMood{) + N today!N);
}
}
LISTAGEM 5.6 MoodyDriver . java
public class MoodyOriver (
}
publi c final stat i c void main{ String [] args ) (
}
IIMoodyObject mo new MoodyObject{); l lno pode instanciar MoodyObject
SadObject so new SadObject();
HappyObject ho new HappyObject() ;
IISystem.out.println( "How does the moody object feel today?" );
Ilmo.queryMood();
IISystem.out.println{ "" );
System. out.println( "How does the sad object fee l today?" };
so.queryMood(); II note que a sobreposi o muda o humor
so.cryO;
System.out . println( MM );
System.out.print l n{ NHow does the happy obj ect feel today?M );
ho.queryHood(); II note que a sobreposio muda o humor
ho.laughO;
System.out.println( N_ );
As al teraes so muito simples. MoodyObject define um mtodo getMood () abstrato e deixa por
conta de suas subclasses fornecer a implementao real. Quando O mtodo queryMood () precisa
recuperar o humor, ele simplesmente faz uma chamada ao mtodo abstrato.
O uso de classes abstratas define o contrato que as subclasses devem atender para utilizar a clas-
se base. Como descnvolvedor, quando voc ver uma classe base abst rata, saber exatamente o
que preci sa especiali7..ar ao herdar. Voc pode especializar os mtodos abstratos. Entretanto,
voc sabe que definindo os mtodos abst ratos, sua nova classe se encaixar na hierarquia corre-
tamente.
Quando uma classe base tem muitos mtodos, pode ser confuso descobri r quais deles devem ser
sobrepostos. As classes abstratas fornecem uma dica.
Herana: ho ra de escrever algum cdi go 107
laboratrio 3: conta em banco praticando
a herana simples
Agora hora de testar seus conheci mentos de herana. Vamos voltar ao Banco 00 e vero que a
herana pode fazer para o sistema de contas do banco.
O Banco 00 oferece aos seus clientes algumas escolhas de contas: uma conta poupana, uma
conta com cheques, uma conta com vencimento programado e uma conta de cheque especial.
Uma conta genrica
Cada ti pc de conta pcrm itc ao usurio depositar e sacar fundos, assi m como veri ficar o saldo cor-
rente. A conta bsica genrica no permite saque a descobert o.
A conta poupana
A conta poupana especial iza a conta genrica do banco, aplicando juros no saldo, quando ins-
truda a fazer isso. Por exemplo, se um depositante tem um saldo de US$I.OOO e a taxa de juros
de 2%, aps o pagamento dos juros, o saldo ser de USS 1020:
balance E balance + (balance * interest_rate)
A conta poupana no pennite saque a descoberto.
Uma conta com vencimento programado
A conta com vencimento programado tambm aplica juros ao saldo. Entretanto, se o titular da
conta fizer qualquer saque do capital investido, antes do prazo de vencimento, banco deduzi r
uma porcentagem do saque. Assim, por exemplo, se o depositante sacar US$I.OOO antes do pra-
zo de venci mento e houver urna multa de 5% sobre o valor sacado, o saldo da conta diminuir
US$IOOO. Entretanto, o depositante receber apenas US$950. Se a conta estiver no vencimento,
o banco no penalizar os saques.
balance E balance - withdraw amount
mas
amount_given_to_depositor amount - (amount * penalty_rate)
a conta com vencimento programado no permite saque a descoberto.
Conta com cheques
Ao cont rrio das contas poupana e com vencimento programado, a conta com cheques no apli-
caj uros ao saldo. Em vez disso, a conta com cheques pcnni te que o depositante emi ta cheques e
faa transacs na conta atravs de ATM (caixa elelrnico de auto-atendimento). Entretanto,
Dia 5
banco limita o nmero de transaes mensais a algum nmero fixo. Se o depositante ult rapassar
essa quota mensal , o banco cobrar uma taxa por transao. Assim, por exemplo, se o deposi tan-
te tiver direit o a cinco transaes gratuitas por ms, mas fi zer oito transaes a uma taxa de US$I
por transao, O banco cobrar do deposi tante uma taxa de US$3:
fee (total _t ransact ions - monthl y_quota) * per_transacti on_fee
A conta com cheques no permite saque a descoberto.
Conta com cheque especial
Finalmente, a conta com chcquc especial perm ite ao depositante sacar dinheiro alm do saldo da
conta. Entretanto, nada de graa. Periodicamente, o banco apl icar uma taxa de j uros no caso
de qualquer saldo negativo. Assim, por exemplo, se o depositante acumular um saldo negativo
de US$I.OOO a uma taxa de 20%, poder pagar uma taxa de US$200. Depoi s da aplicao da
taxa, seu saldo ser de - US$ 1200:
balance balance + (balance * i nterest_rate)
Noteque o banco s calculajuros em contas com saldo negativo! Caso contrrio, o banco acaba-
ria di stribui ndo dinhei ro. O Banco 00 no est no ramo de distribuio de dinheiro. Nem mes-
mo para desenvolvedores.
Ao cont rario da conta com cheques, a conta com cheque especial no coloca um I imite no nlllne-
ro de transaes mensais. O banco estimulari a os saques - eles poderiam cobrar juros!
Exposio do problema
Sua tarcfa formular uma hierarquia de herana e implementar as contas confonne definido an-
teriorment e. Voc deve criar as seguintes classes de conta:
BankAccount
Savi ngsAccount
TimeMaturityAccount
CheckingAccount
OverdraftAccount
BankAccount a classe base. Ela contm as tarefas comuns a todas as contas. Essa a nica dica
hierrquica que voc ter 1 Part e do laboratri o voc experimentar as hi erarquias de herana.
Existem v rias si mpl ifi caes que voc pode fazer. Para clcul os de taxas, vencimento pro-
gramado e j uros, suponha que out ra pessoa observar o calendrio. No programe esse tipo de
funcionalidade em suas classes. Em vez disso, fornea um mtodo para outro objelo chamar.
Por exemplo, SaVl ngsAccount deve ler um mtodo addlnterest (). Um objeto externo cha ma-
ra o mtodo. quando for hora de calcular osjuros. Do mesmo modo, Checki ngAccount deve ex-
por um mtodo access FeesO. Quando chamado, esse mtodo calcular todas as laxas e as
aplicar no saldo.
NOTA
Herana: hora de escrever algum cdigo 109
No se atrapalhe com detalhes desnecessrios. lembre-se de que voc est
completando este laboratri o para ganhar experi ncia prtica com herana e
no para escrever o sist ema de conta mais robusto possivel. Assim, no se
preocupe com a validao da entrada (a no ser que queira fazer isso). Voc
pode supor que todos os valores dos argumentos sero sempre vl idos.
o Dia 4 abordou brevemente o uso de super. super no um conceito dificiL Considere
a sel eo a seguir:
publlc COfTlTlissionedEmployee( String first_name, String last_name,
I
double wage, double cOfTlTlission ) 1
super(first_name, last_name,wage l; II chama o construtor origi nal
II para inicializar corretamente
this.cOfTlTlission cOfTlTlission;
Quando voc chama super dentro de um construtor, isso permite que o construtor da
progenitora seja chamado. claro que voc deve fornecer todos os argumentos exi gi
dos pelO construtor da progenitora. A maioria das linguagens, Java inclulda, exi ge
que, se voc chamar super dentro do construtor, ento deve fazer isso antes de tudo.
Na verdade, se voc no chamar super, automaticamente a linguagem Java t entar
chamar superO sozinha.
super permite que voc destaque o cdigo da progenitora, que de outro modo seria
simplesmente sobrescrito. No caso dos construtores, super permite que a fil ha chame o
construtor de sua progenitora.
Chamar corretamente o construtor da progenitora al go que voc no deve desprezar.
Voc precisa garantir que a classe seja inicial izada corretamente.
Voc tambm pode usar super dentro de um mtodo.
Imagine uma classe VeryHappyObject,
publ 1c class VeryHappyObject extends HappyObject {
I
II redefi ne o humor da cl asse
protected String getMoodO {
String old_mood super.getMood();
return "very" + old_mood;
I
VeryHappyObject SObrepe getMood(). Entretanto, super.getMood() permite que Very-
HappyObject chame a verso da progenitora de getMood (). VeryHappyObject especi ali za
o mtodo getMood () de sua progenitora, realizando algum processamento extra no va-
l or retornado por super .getMood ().
Assim, mesmo que uma f ilha sobreponha o mtodo de sua progenitora, a filha ainda
poder destacar o cdigo exi stente na progenitora.
Dia 5
Assim como em um construtor, se voc usar super para chamar um mto-
do, ento deve fornecer t odos os argumentos que o mtodo possa exigir.
Voc achar super til neste laboratrio.
Pare agora e complete o laboratri o, caso se sinta vontade. Se voc precisar de um pouco mais
de ajuda, cOluinue a ler.
Exposio estendida do problema
Se voc ainda se acha perdido, estas interfaces devem aj ud lo um pouco. Essas interfaces repre
sentam apenas unta maneira de completar o laboratrio.
BankAccount contm os seguintes mtodos:
publi c void depositfunds( double amoun t )
publ ic double getBal ance()
public double withdrawfunds( double amount )
protected void set8al ance( double newBalance )
Savi ngsAccount deve conter os seguintes mtodos:
public void addlnterest()
public void setlnterestRate( double interestRate )
public double getlnterestRate()
TimedMaturityAccount contm os seguintes mtodos:
public boolean isMature()
public void mature()
public double getfeeRate()
public void set feeRate( double rate)
Ti medMatu ri tyAccount precisar redefi nir wi thdrawfunds () para veri fi car o venci mento e apli
car todas as taxas necessrias.
Checki ngAccount contm os seguintes mtodos:
pub li c void accessfees()
publi c double getFee()
public void setfee( double fee )
public int getMonthl yQuota{)
public void setMonthl yQuota( int quota)
public int getTransact ionCount()
Checki ngAccount precisar sobrepor wi thdrawfunds () para controlar o nmero de transacs.
Herana: hora de escrever algum cdigo
OverdraftAccount contm os seguintes mtodos:
publl c void chargelnterest()
public double getCreditRate()
publ i c void setCredltRate( double rate)
"1
OverdraftAccount pode precisar sobrepor withd rawFunds (), caso 6ankAccount coloque cheques
a descoberto no mtodo.
Talvez voc tambm queira iniciar sua hierarquia com a classe Account, que desenvolveu para o
Laboratri o 2 no Dia 3. A (mica mudana que voc dever fazer no mtodo wi thdrawFunds{).
Voc provavelmente deve colocar proteo contra saque a descoberto nos mtodos withdraw-
Funds ().
A prxima seo di scute as solues do Laboratrio 3. No prossiga at con-
cluir o Laboratri o 3.
Solues e discusso
A Figura 5.2 ilustra a hierarquia de herana resultante de conta.
FI GURA 5 .2
ii hierarquia de conta elll
baIlCO.
S8"; nll'''' """"nl
Bel'llAccounl
OvtIrd flAccounl
Ti mflMalll. 11'1 Acooun I
Ch",klnll
4
CCOllOl
import ante ter essa hierarquia em mente, enquanto voc considera as solues a seguir.
A Listagem 5.6 apresenta uma possivel implementao de 6ankAccount. Essa classe base contro-
la o saldo e manipula depsitos e saques.
LI STAGEM 5.7 BankAccount.j ava
publl c class 6ankAccount {
II dados privados
private double balance;
1 11 2 Dia5
LISTAGEM 5.7 BankAccount.java (continuao)
}
II construtor
public BankAccount( double initoeposit ) {
setBalance( initDeposit ):
}
II deposita dinheiro na conta
public void depos1tFunds( double amount ) {
}
II a classe base no apl ica regras s contas
II no valida a entrada
setBalance( getBalance() + amount ):
II consulta o saldo
public double getBalanceO {
return balance;
}
II configura O saldo
protected void setBalance( double newBa l ance ) {
balance newBalance:
}
II saca fundos da conta
publ ic double withdrawFunds( double amount } {
if( amount >'" balance) {
amount balance:
}
setBalance( getBalance() - amount );
return amount;
}
Savi ngsAccount, na Listagem 5.8, herda diretamente de Ban kAccount. Sav i ngsAccount especiali-
za BankAccount, adi cionando mtodos para obter e confi gurar a taxa de juros, assim corno um
mtodo para apl icar juros no saldo da cont a.
LISTAGEM 5.8 Savi ngsAccount.java
publiC class SavingsAccount extends BankAccount {
II dados privados
private double interestRate:
II Cria novo SavingsAccount
public SavingsAccount(double initBal ance , doubl e interestRate }I
supere initBalance ) :
setInterestRate(interestRate l:
Herana: hora de escrever algum cdi go
LI STAGEM 5 .8 Savi ngsAccount. j ava (continuao )
}
}
II calcula e soma juros na conta
public voi d addInterest() {
double balance = getBal ance( ) ;
double rate z get InterestRate() ;
doubl e interest balance * rate ;
double new balanc e z balance + i nterest;
set Balance{ new_balance );
}
II configura a t axa de juros
pu bli c voi d set InterestRate( double i nterestRate ) {
this.interestRate z interestRate ;
}
II cons ulta a taxa de juros
publ ic doubl e getInterestRate() {
return interestRate;
}
113
Ti meMa t urityAccount, na Listagem 5.9, herda de SavingsAccount, pois juros podem ser aplica-
dos em seu saldo. Entretanto, ela especiali za sua progenitora, definindo mtodos para configu-
rar o nvel de vencimento e taxas. Interessante o fato de que essa classe redefine o mtodo
wi thdrawFunds (). Atravs de uma chamada a super .wi thdrawFunds () , esse mtodo ai nda usa a
funciona lidade original; ent retanto, ela acrescenta as verificaes necessri as para ver se precisa
acessar uma taxa para a transao. Se assim for, ela acessa a taxa c retorna o valor do saque, me-
nos a taxa.
LISTAGEM 5 .9 Ti meMaturi tyAccount . java
class Ti medMaturityAccount extends SavingsAccount {
II dados pri vados
private boolean ma ture;
private double feeRate;
II Cria novo TimedMa turi tyAccount
public TimedMaturityAccount( double i nitBalance.
double interestRate.
double fee Rate ) I
super ( initBalance . interestRate ) ;
set FeeRate ( feeRate );
}
1 11 4 Dia5
LI STAGEM 5.9 TimeMaturityAccount.java (continuao)
}
II sobrepe withdrawFunds de BankAccount
public double withdrawFunds( double amou nt ) I
super.withdrawFunds( amount ):
}
if( !isMature() ) I
}
double charge amount * getFeeRat e() :
amount amount - charge :
return amount:
II verifica o vencimento
public bool ean isMature() I
return mature:
}
II faz vencimento
publ ic void mature() {
mature true ;
}
II % de taxa para saque anteCi pado
publ ic doubl e getFeeRate() {
return feeRate:
}
II configura % de taxa para saque antecipado
public voi d setFeeRate( doubl e rate) I
feeRate rate:
}
Checki ngAccoun t, na Listagem 5. I O, herda diretamente da classe base BankAccount. Essa classe
adiciona os mtodos necessrios para configurar a taxa por transao, configurar a quota mensal,
reconfi gurar a cont a da transao e consultar o nmero de transaes corrente. Essa classe tam-
bm sobrepe o mtodo wi thdrawFunds () para controlar o nmero de transaes. Assim corno
Ti medMaturityAccount, ChecklngAccount ainda usa a lgica original, chamando super .with-
drawFundsO.
LI STAGEM 5.10 CheckingAccount.java
publiC cl ass CheckingAccount extends BankAccount I
II dados privados
private int monthlyQuota :
private int transact ionCount:
private double fee :
II Cria novo CheckingAccount
Herana: ho ra de escrever algum cdigo
LI STAGEM 5.10 Checkl ngAccount . java (continuao)
publiC ChecklngAccount( double initOeposit , int trans, double fee } {
supere inltOeposit }:
setMonthlyQuota( trans l :
set Fee( fee ):
J
II sobrepe withdrawFunds de BankAccount
public double withdrawFunds( double amount ) {
transactlonCount++:
return super .withdrawFunds( amount l:
J
II acessa as taxas se ultrapassou o l imite de
public void accessFees() (
J
int extra a getTransactionCount() - getMonthlyQuota():
if( extra> O ) {
double total_fee extra * getFee{) j
double balance ge tBalanceO total fee:
setBalance( balance );
J
transactionCount a O:
II al guns mtodos de obteno e configurao
public double getFee() {
return fee;
J
public void setFee( double fee ) (
this. fee fee;
J
J
publi c int getMonthlyQuota() {
return mont hlyQuota:
J
public void setMonthlyQuota( int quota) {
monthlyQuota a quota:
J
publi C int getTransactionCount() {
return transactionCount:
J
115
Finalmente. Ove rdra ftAceount, na Listagem 5.1 I, herda diretamente de BankAceount . Entretan-
to, ela tambm adiciona mtodos para configurar a taxa de juros de saque a descoberto e para
apli car quaisquer taxas de juros.
Dia 5
LI STAGEM 5.11 OverdraftAccount . java
public class Ove rdraftAccount extends BankAccount I
I
II dados privados
private double creditRate;
II Cria novo OverdraftAccount
public OverdraftAccount( double initOeposit. double rate) (
super( 1nitOeposit ) j
setCreditRate( rate ) j
I
II cobra j uros sobre qualquer di nhei ro emprestado
public void chargelnterest() {
I
double balance a getBalance()j
if(balance < O ) I
I
double charge balance * getCreditRate()j
setBalance( balance + charge )
II consulta a taxa de crdito
publ ic double getCreditRate() (
return creditRate
I
II configura a taxa de crdito
public void setCreditRate( double rat e) {
creditRate ratei
I
II saca fundos da conta
public double withdrawFunds( double amount ) (
setBalance(getBal ance() - amount )j
return amountj
I
Cada uma dessas classes especial iza sua progenitora de uma maneira ou de outra. Algumas,
corno SavingsAccount, simplesmente adicionam novos mtodos. Outras. como Chec-
ki ngAccount, Ove rdraftAccount e TimedMaturi tyAccount, sobrepem o comportamento padro
da progenitora, para aumentar a funcionalidade.
Este laboratrio o expe aos mecanismos da herana, assim como herana para reuti lizao de
implementao e programao pela diferena.
Herana: hora de escrever algum cdigo 117
Embora no seja mostrada aqui, voc tambm pode usar a capacidade de conexo, pois a classe
comum BankAccount se relaciona a todas as contas. Qualquer um que sai ba como atuar na classe
base BankAccount pode sacar, deposi tare emitir um cheque nos fundos de qualquer tipo de conta.
Voc vai explorar a capacidade de conexo com detalhes por todo o Dia 6, "Polimorfi smo:
aprendendo a prever o fut uro", e Dia 7, "Polimorfi smo: hora de escrever algum cdigo".
laboratrio 4: estudo de caso
"tem um" e java.util.Stack
Il um"l
Quando se ini ciante em 00, pode ser tentador ver a li nguagem Java como um exemplo de pro-
jeto ori ent ado a objetos perfeito. Voc pode di zer a si mesmo, "se a linguagem Java faz isso,
deve estar correto". I nfel izmente, colocar confiana inquesti onvel em qualquer implementao
00 perigoso.
Vamos rever a estrutura de dados de pilha clssica. Voc pode colocar itens em uma pilha, extrair
itens de uma pilha e olhar o primeiro elemento da pilha, sem remov- lo. Talvez voc tambm
quisesse ver se a pi lha est vazia.
A linguagem Java tem uma classe Stack. A Listagem 5.12 ilustra a interface.
Lt STAGEM 5. 12 java.utll.Stack
publ lC class Stack extends {
public boolean empty() ;
publi c Object peek();
public Object pop ();
}
public Object push( Obj ect item ) ;
public int search( Object o ) ;
Voc notam que a linguagem Java ol im iza um pouco a definio clssica de pi lha. A linguagem
Java acrescenta um mtodo search(). O mtodo push () tambm retorna o it em que voc coloca.
Entretanto, h um problema maior. A classe Java Stack tambm herda de Vector. De um ponto
de vista, essa uma deci so inteligente. Herdando de Vector, St ack obtm toda a implementao
contida em Vector. I)ara implementar Stack, tudo de que voc precisa envolver os mtodos de
Stack para chamarem internament e os metodos herdados de Vector corretos.
Infelizmente, a classe Java Stack um exemplo de herana pobre. Stack passa no teste ' um'?
"Um objeto Stack ' um' Vector"? No- o teste fal ha. Vector tem todos os tipos de mtodos
para colocar elementos em Vector e remov-los. Um objeto Stack s permi te que voc coloque
elementos no topo da pilha. A classe Vector permi te que voc insira e remova elementos em
qualquer parte.
Aqui , a herana pennite que voc interaja com a classe Stack de maneiras indefinidas para uma pilha.
Dia 5
Exposio do problema
Stack passa no teste ' tem um'. "Um objeto Stack ' tem um' objeto Vector". Para este laboratri o,
escreva uma nova verso de Stack que empregue o ti po correto de reut ilizao de implementao.
ALER TA
A prxima seo discute as solues do laboratrio 4. No prossiga at con
cluir o laboratrio 4.
Solues e discusso
A Listagem 5. 13 ilustra uma possivel implementao de Stack
LI STAGEM 5. 13 A New Stack Implementation
public cl ass Stack (
private java.util .Arraylist list :
publ ic StackO(
list new java.uti l .Arrayl ist() :
}
public boolean emptyO (
return l ist.isEmptyO :
}
publiC Object peek() I
if( !emplyO } I
return li st .get( O };
}
return null :
}
publi C Object popO (
if( !emplyO } I
return list.remove{ O ):
}
return nul l;
}
publiC Object push( Object item ) (
list . add( O, item l :
return item:
}
Herana: ho ra de escrever algum cdigo 119
LISTAGEM 5.13 A New Stack Implementation (continuao)
J
publ iC int search( Object o ) {
int index l i st. indexOf ( o ,;
if( index ! - - 1 ) {
return index + 1;
J
return - 1;
J
Se este laboratrio nos ensi nar algo, que no devemos depositar toda nossa f em qualquer fon-
te de 00. Nada perfeito.
Resumo
Hoje, voc completou quatro laboratri os. O Laboratrio I permi ti u que voc experi mentasse a
herana simples. Aps concluir o Laboratrio 1, voc deve ter entendido o mecanismo bsico da
herana. a Laboratri o 2 permiti u uma maior explorao da herana, atravs da classe abstrata e
da herana planejada. O Laboratrio 3 deve ter solidifi cado as li es do Dia 4. Os laboratrios I
e 2 permiti ram ver mtodos e atributos redefinidos, novos e recursivos. Voc tambm viu como,
mesmo se sobrepuser um mtodo. ainda pode usar a implementao da progenitora.
a Laboratri o 4 ilustrou a importncia de considerar os testes ' um' e 'tem um', enquanto se
formam hierarquias de herana. s vezes, a melhor ao no herdar. Conforme o Dia 4 enfati-
za, a composio freqUentement e a fomla mais limpa de reutilizao. A herana s faz sentido
do ponto de vista relacional ou ' um' . Se dois objetos no esto relacionados pelo tipo, ento
eles no devem herdar. A implement ao compart ilhada no motivo sufi ciente para herdar.
Dentro de um sistema ou aplicati vo, voc sempre deve planejar a mxima herana possvel.
Entretanto, quando programa para um apl icativo espec fi co, voc est limitado a esse programa.
Com o passar do tempo, voc trabalhar em muit os programas diferentes. Quando voc comear
a notar que est programando as mesmas coisas repetidamente, as oportunidades para herana
comearo a se apresentar. Voc sempre deve estar atento a essas hi erarquias de herana desco-
bertas. Voc deve refazer seu cdi go, quando descobrir essas novas hi erarquias.
Perguntas e respostas
P No Laboratrio 4, voc mostrou como at a linguagem Java comete erros de 00.
Quando eu examinar as APls Java ou outras fontes de exemplos de 00, como pode-
rei ter certeza de que o que estou vendo ' boa' ao?
Dia 5
R dificil dizer o que constitui a ' boa' 00 e a ' m' 00, mesmo aps ter mui ta experincia
em 00. A melhor coisa que voc pode fazer aplicar o que aprendeu e nunca tomar um
exemplo como garant ido. Encare cada exemplo ponderadamente e, se algo no parecer
correto, discuta isso com seus colegas: obtenha uma segunda opinio.
Workshop
As perguntas e respostas do teste so fornecidas para seu melhor entendimento. Veja as respos-
tas no Apndice A, ' Respostas".
Teste
I. A partir das solues de laboratrio, d um exemplo de mtodo redefinido, de mtodo re-
cursivo e de novo mtodo.
2. Por qu voc declararia uma classe como sendo abslrata?
3. No Laboratri o 4, voc explorou os relacionamentos ' um' e 'tem um'. Antes mesmo de
aprender a respeito de herana, voc viu relacionamentos ' tem um'. Quais os relaciona-
mentos ' tem um" voc vi u nos laboratrios do Dia 3?
4. Como esses laboratrios preselVaram o encapsulamento entre a classe base e as subclasses?
5. A partir das solues, encontre um exemplo de especiali zao.
6. Como as solues do Laboratrio 3 e do Laboratri o 4 adotam lima estralgia diferente
para reutil izao de implementao?
Exerccios
No h exerccios hoje. Faa seus laboratrios!
SEMANA 1
DIA
Polimorfismo: aprendendo a
prever o futuro
At aqui, voc aprendeu sobre os dois primei ros pilares da programao orientada a objelos: en-
capsulamento e herana. Como voc sabe, o encapsulamento permi te construir componentes de
soft ware independentes e a herana pennite reutilizar e estender esses componentes. Entretanto,
ainda falta algo. O soft ware est sempre mudando. Se os usurios exigem nova runcional idade,
erros aparecem ou o software precisa ser integrado em novos ambientes, a nica constante a
mudana. O ciclo de vida do soft ware no tennina quando voc di stribui um produto. Voc pre-
cisa de sof1ware que possa se adaptar s necessidades futuras. No seria timo, se voc pudesse
escrever software ' prova do futuro'?
Um software prova do futuro se adapta aos requisitos futuros sem alterao. Um software fi
prova do futuro permi te que voc faa alteraes e adicione novos recursos facilmente. Feliz
mente, a POO entende que um software de sucesso no esttico. Assim, a POO usa o conceito
de polimorfi smo para permitir que voc escreva esse soft ware prova do futuro.
Voc pass<lr os prximos dois dias considerando o polimorfismo, o terceiro e ltimo pilar da
programao ori entada a objetos.
Hoje voc aprender:
o que polimorfismo
Quai s so os diferentes tipos de poli morfismo e o que eles oferecem para seus objetos
Dicas vali osas para o polimorfismo eficaz
122
Dia 6
A respeito de algumas armadil has do polimorfi smo
Como o pol i morfi smo atinge os obj eti vos da 00
Polimorfismo
Se o encapsulamento e a herana so os socos um e dois da POO, o polimorfismo o soco para
nocaute seguime. Sem os dois primeiros pilares, voc no poderia ler o polimorfi smo, e sem o
polimorfismo, a POO no seria eficaz. O polimorfismo onde o paradigma da programao orien-
tada a objelos realment e brilha e seu domnio absolutamente necessri o para a roo eficaz.
Polimorfismo significa muitas formas. Em termos de programao, o paI imorfi smo penn ite que
um nico nome de classe ou nome de mtodo represente um cdigo diferente, selecionado por
algum mecanismo aut omti co. Assim, um nome pode assumir mui tas formas e como pode re-
presentar cdigo difercnte, o mesmo nome pode representar mui tos comportamcntos di ferentes.
Novo TERMO
Polimorfismo: ter muitas ronnas. Em tennos de programao, mui tas rormas sign i-
fica que um nico nome pode representar um cdigo direrente, selecionado por al-
gum mecanismo automtico. Assi m, o polimorfismo pennite que um unico nome expresse muitos
componamentos direrentes.
De sua prpria maneira, o polimorfismo o di sturbio das multiplas personalidades do mundo do
somvare, pois um ni co nome pode expressar muitos comportamentos direrentes.
Toda essa conversa sobre expressar 'muitos componamentos di rerentes' pode parecer um pouco
abstrata. Pense no termo abrir. Voc pode abrir uma porta, uma caixa, uma janela e uma conta
no banco. A palavra abrir pode ser aplicada a muitos objetos direrentes no mundo real. Cada oh-
jeto int erpreta 'abrir' de sua prpria maneira. Entretanto, em cada caso, voc pode simplesmente
dizer ' abrir', para descrever a ao.
Nem todas as li nguagens suponam poli morfi smo. Uma linguagem que suporta polimorfismo
uma lingl/agem polimrfica. Em contraste, uma lingl/agem monomrfica no suporta polimor-
fi smo e, cm vez disso, restringe tudo a um e apenas um comportamento estti co, pois cada nome
estaticamente vinculado ao seu cdigo.
A herana rornece o aparato necessrio para tornar certos tipos de polimorfi smo possveis. No
Dia 4, "Herana: obtendo algo para nada", voc viu como a herana permite fonnar relaciona-
mentos com capacidade de substi tuio. A capacidade de conexo extremamente imponante
para o poli morfismo, pois ela pennitc que voc trate um tipo especfico de objeto genericamente.
Considere as classes a segui r:
publl C class Personal ityObject (
}
public St r ing speak() {
return - I am an object.";
}
Polimorfismo: aprendendo a prever o futuro
pub1i c c1ass Pessimi sticObject extends Personali t yObject (
public St r ing speak() {
return "The glass i s half empty . ":
I
I
pub1ic class Opt imisticObject extends Personal ityObject (
pub1ic String speak() {
ret urn "The gl ass is ha 1 f fu ll. ":
I
I
publiC class IntrovertedObject extends PersonalityObj ect (
publlc St ring speak() {
return "hi ... ";
I
I
publi C cl ass ExtrovertedObject extends PersonalityObject (
public Stri ng speak() {
return "Hell o. blah blah blah. did you know that bl ah blah blah. M:
I
I
123
Essas classes formam uma hierarquia de herana muito si mples. A classe base, Persona-
1 i tyObject, declara um mtodo: speak(). Cada subclasse redefi ne speak () c retorna sua prpri a
mensagem, baseada em sua personalidade. A hierarquia forma relacionamentos com capacidade
de substituio entre os subtipos e seus progenitores.
Considere O mtodo mal n () a segui r:
public static void main(String [] args ) (
Persona1 1tyObject personality E new PersonalityObject();
Pess1misticObject pessimistic " new Pessimi sticObject() :
OptimisticObject optimist ic " new OptimisticObject( ):
IntrovertedObject introverted E new IntrovertedObject();
ExtrovertedObject extroverted " new Ext rovertedObject():
II a capacidade de substi tuio permite fazer o seguinte
Personal ityObject [] personal ities " new Personal ityObject [5] :
personali t ies [O] personal ity:
personalities (1] pessimistic;
personalities [2] opt imi st i c:
personalities [3] introverted:
persona 11 t i es [4] ext roverted;
I I o polimorfismo faz com que PersonalityObject parea ter
I I muitos comportamen tos diferentes
J
Dia 6
II l embre-se - o polimorf i smo o distrbio das mlti plas
Ilpersonalidades do mundo 00
System.out.print ln( "Per sonaIHyObject[O] speaks: " +
pe r sona 1 i t ies[O] . speak(;
System.out.printl n( "Per sonaI HyObject[ l] speaks: M +
personal it i es( l). speak( :
System. out.print ln( "PersonaI HyObject [2] speaks: M +
personal i ties [2] . speakO) :
System. out . prlntln( "PersonalityObject[3] speaks: " +
persona 1 i t i es [3) . speak O) :
System.out.println( "PersonalityObject[4} speaks : " +
personalities[4}.speakO) :
Os primeiros dois teros do mtodo mai n{) no apresentam nenhuma novidade. Conforme voc
viu no Dia 4, a capacidade de substitui o permite tratar um objeto genericamente. Ent retant o, o
trecho a seguir onde o exemplo se torna interessante:
1/ o pol imorfismo faz com que PersonalityObject parea ter
l/muitos comportamentos diferentes
II lembre- se - o polimorf i smo o distrbi o da s m l ti plas
Ilpersonalidades do mundo 00
System.out.println( "Per sonaI HyObject[O] speaks: " +
pe r sonal i t ies[O] . speak( ;
System.out.print ln( "Per sonahtyObject[ l] speaks: M +
persona 1 H ies[ I] . speakO) :
System.out.print ln( "Per sonalityObject [2] speaks: M +
persona I i ties (2) . speak() :
System.out.println( "Per sonalHyObject (3] speaks: " +
persona 1 i ties (3) . speak O) :
System. out . println( "PersonalityObject(4) speaks : +
personal ities(4] . speakO) ;
A Figure 6. 1 ilustra a sada.
FIGURA 6.1
Demolls'raeio do
compor/mllell/O polim/fico.
Po limo rfismo: aprendendo a prever o futuro 125
Com base na sada, parece que o mtodo speak() de Personal i tyObject tem muitos comporta-
mentos diferentes. Mesmo que PersonalHyObject defina speakO para imprimir "1 am an ob-
ject", Pe rsona 1 i tyObject est exibindo mais de um comportament o. Mesmo que o array
supostamente contenha instncias de Persona 1 i tyObject, cada membro do array se comporta de
forma diferente, quando o mtodo principal chama o mtodo speak (). Esse o dilema do com-
portamento poli mrfico; Personal 1tyObject, o nome, parece ter muitos comportamentos.
Novo TERMO
NOTA
persona 1 it i es um exemplo de varivel polimrfica. Uma vari(11ef polimrfica
uma varivel que pode conter muitos tipos diferentes.
Em uma linguagem tipa da, as variveis polimrficas esto restritas a conter
valores especfi cos. Em uma linguagem dinamicamente tipada, uma varivel
polimrfi ca pode conter qualquer valor.
o exemplo anterior explica o mecanismo, mas ele poderia no representar adequadamente o es-
prito do polimorfismo. Afi nal, voc sabe exatamente o que o array contm.
Em vez disso, imagine que voc tenha um objelo cujo mtodo recebe um objeto Persona-
1 i tyObject como parmetro:
public void makeSpeak( PersonalityObject obj ) I
System.out. print ln( obj.speak() );
I
Os relacionamentos com capacidade de subst ituio permitem que voc passe uma instncia do
objeto Personal i tyObject ou qualquer descendente dessa classe para o mtodo makeSpeak (),
como um argumento. Assi m, ao criar descendentes especializados de Persona 1 i tyObject, como
Ext rovertedObject, voc no precisa mudar a lgica do mtodo para que ele use instncias das
novas classes como argumento. Em vez disso, voc pode simplesmente instanciar Extrover-
tedObject (ou qualquer descendente) e passar a instncia para o mtodo.
O polimorfismo entra em ao quando o mtodo makeSpeak() chamado e lhe passado um
obj eto como argumento. O polimorfi smo garant e que o mtodo correto seja chamado atravs do
argumento de Persona 1 i tyObject, chamando o mtodo do objeto com base no tipo da c lasse real
do argumento, em vez do tipo da classe que o mtodo makeSpeakO pensa que est usando.
Assim, se voc passar um objeto ExtrovertedObject, o polimorfismo garantir que a definio
de speak () de ExtrovertedObject seja chamada e no aquela encontrada na classe base. Como
resultado, makeSpeak() apresentar mensagens diferentes na tela, dependendo do tipo de argu-
mento que for passado.
Voc pode apri morar o polimorfismo para adicionar nova funci onal idade em seu sistema, a
qualquer momento. Voc pode adicionar novas classes, que tenham funcionalidades jamais ima-
ginadas quando O programa foi escrito pela pri meira vez - tudo isso sem ter de mudar seu cdi -
,
go j existente. E para isso que serve o software prova do futuro.
Dia 6
Este exemplo apenas a ponta do iceberg polimrfi co. Na verdade, o exemplo representa apenas
uma das mui tas formas do polimorfis mo. O prpri o polimorfi smo correto poli mrfi co!
Infeli zmente, ai nda h pouco consenso na comunidade de 00 quando se trata de polimorfi smo.
Em vez de ent rar na controvrsia, este livro apresentar quatro formas de polimorfismo. O en-
tendimento dessas quatro fonnas comuns deve dar-lhe a base de que voc precisa para comear a
aplicar o polimorfismo. Hoje voc aprender sobre:
I. Polimorfismo de incluso
2. Polimorfismo paramtrico
3. Sobrepos io
4. Sobrecarga
Polimorfismo de incluso
o pol imorfi smo de incluso, s vezes chamado de poli morfismo puro, permite que voc trale ob-
j etos relacionados genericamente. Voc viu o poli morfismo de incluso pela primeira vez, no
incio do dia.
Considere os mlodos a seguir:
publ 1c v01d makeSpeak( Pess1mist1cObject obj ) I
System.out.println( obj.speak() ) ;
}
publ1C v01d makeSpeak( OptimisticObject obj ) I
System. out . println( obj.speak( ) );
}
public v01d makeSpeak( IntrovertedObject obj ) (
System.out.println( obj . speak() ):
}
publ ie void makeSpeak( ExtrovertedObject obj ) (
System.out.println( obj . speak() ) :
}
Pess1m1sticObject, OptimisticObjeet . IntrovertedObject e Ext rovertedObject esto todos
rel acionados, pois lodos eles so objetos Persona 11 tyObj eet. A capaci dade de subst ituio e o
polimorfi smo de incluso pennitem que voc escreva um mtodo para manipular lodos os tipos
de objctos Persona1 1 t yObject:
pu bl 1c void makeSpeak( PersonalityObject obj ) I
System.out.println( obj.speak() ) ;
}
Polimorfismo: aprendendo a prever o futuro 127
A capacidade de substit uio permite que voc passe qualquer obj elo Persona I i tyObject para
o mtodo e o polimorfi smo garant e que o metodo correto sej a chamado na instncia. O poli-
morfismo chamar o mtodo com base no tipo verdadeiro da instncia (Optimi st icObject.
IntrovertedObject . ExtrovertedObject ou Pess imisticObject) e no cm seu tipo aparente
(Persona 1 i tyObject).
O pol imorfis mo de incluso lltil porque di mi nui a quantidade de cdi go que precisa ser escri to.
Em vez de ter de escrever um mtodo para cada ti po concreto de Personal i tyObject, voc pode
simplesmente escrever um mtodo que manipule todos os tipos. O polimorfi smo de incl uso e a
capacidade de substituio permitem que makeSpeak() funcione cm qualquer objeto que ' sej a
um' Persona 1 ityObj ect.
O polimorfismo de incluso torna mai s fcil adicionar novos subtipos em seu progra ma, pois
voc no precisar adicionar um mtodo especificamente para esse novo tipo. Voc pode sim-
plesmente reut ilizar makeSpeak{).
O polimorfismo de incluso tambm interessante porque faz parecer que as instncias de
Personal i tyObject exibem muitos comportamentos diferentes. A mensagem apresentada por
makeSpeak () ser di ferente de acordo com a entrada do mtodo. Atravs do uso cuidadoso do p0-
li morfismo de incluso, voc pode mudar o comportamento de seu sistema, int roduzindo novas
subclasses. A melhor part e que voc pode obter esse novo comportamento sem ler de alterar
nenhum cdigo j existent e.
O polimorfismo o mot ivo pelo qual voc no deve associar automaticamente herana com reu-
tili zao de implement ao. Em vez disso, voc deve usar herana principal mente para permitir
um comportamento polimrfico atravs de relacionamentos com capacidade de substituio. Se
voc definir corretamente os relacionamentos com capacidade de subst ituio, a reutil izao
ser automt ica. O poli morfi smo de incluso permite que voc reutil ize a classe base, qualquer
descendente, ass im como os mtodos que usam a classe base.
Agora, voc provavelmente j entende o mecani smo, mas por que desejaria usar pol imorfi smo
de incluso?
Considere a hi erarquia a seguir:
publi c abstract class Baselog {
II al gumas constantes teis ; no s.
private f inal static String DEBUG
private f ina l static String INfO
private f i nal stat i c St r ing WARNING
private f inal statl c St r ing ERROR
private f inal st atlc St r ing fATAL
preocupe com a si ntaxe
"DEBUG'"
-
MINfO'"
"WARNING" ;
8ERRQR";
8fATAl'"
java.text . Da teformat df java.text.OateFonmat.getDateTimeInstance( ) ;
}
Dia 6
public void debug( St ring message ) {
log( message, DEBUG, getDate() );
}
public void info( Stri ng message ) {
log( message , INFO. getoateO , ;
}
public voi d warn;ng( St ring message ) (
l og( message , WARNING. getDate() ) ;
}
publ ic void error( String message ) (
log ( message , ERROR , ge tDate() );
}
publi c voi d f atal ( String message ) (
log( message , FATAL, getoateO );
}
II cr ia uma indicaao de tempo
protected String getDateO {
}
java.ut il. Date date" new java.util.DateO;
return df.format( date );
II permite que as subclasses def i nam como e onde vo gravar o l og
protected abstract voi d l og( St ring mess age, String leve I . St r i ng t ime ,;
BaseLog um log abstrai o que define a interface pblica de um log, assim como alguma imple-
mentao. Ba seLog abstraIo porque cada desenvol vedor precisa personalizar o modo como o
log gravado. Todo desenvolvedor de Baselog deve definir o mtodo logO.
Tomando a classe abstrata, voc garante que todo desenvolvedor implement e as subclasses cor-
retament e. Tal estratgia permite que voc rellti I ize o projeto do log entre muitos aplicali vos di-
ferentes. Quando um novo aplicativo aparecer, voc poder simpl esmente fornecer a
implementao necessria para esse apli cat ivo. No h necessidade de cri ar um novo projeto de
logo Em vez disso, voc pode reutilizar o projeto de log delineado em Baselog, fornecendo im-
plementaes personali zadas.
publi c class Filelog extends Baselog {
private java .i o.Pri ntWriter pw;
public Fi l elog ( Stri ng filename )throws java.i o. IOExcepti on {
pw new java.io. PrintWriter( new java.i o. FileWriter( f ilename ) , ;
}
protected void log( St r ing message , String leveI . Stri ng ti me) {
pw. pr intln( l evel + "; " + t ime + M; M + message );
Polimorfismo: aprendendo a prever o futuro
pw. flush();
}
public void close() (
pw.c1ose() ;
}
pu bl i c class Screenlog extends Baselog (
}
protected void log( St ring message , String level , String time) (
System. out.println( l eve l + "; " + ti me + ": " + message ) ;
}
129
Fi 1 elog e Screenlog herdam de Baselog e implementam o mtodo 1 og(). Fi 1 elog grava em um
arquivo, enquanto Screenlog escreve na tela.
Lembrando do exemplo Emp l oyee do Dia 4, razovel suspeit ar que exi sta urna classe que saiba
corno recuperar objetos Emp10yee a partir de um banco de dados:
pub1ic class Empl oyeeDatabaseAccessor (
private Baselog error_log ;
public Empl oyeeDat abaseAccessor( Basel og l og ) throws InitDBException {
error_log l og;
try (
II a conexo com o banco de dados
I cat ch( DBExcept ion ex ) I
error_l og. fatal ( "cannot access database: " +
ex.getMessage() );
throw new Ini tDBException( ex.getMessage() );
}
}
}
public Emp10yee ret rieveEmp1oyee( St r ing first name , String last name )
throws EmployeeNotFoundException {
}
try {
II tenta recuperar o fu ncionrio
return nu11;
} catch( Emp1oyeeNotFoundExcept ion ex ) {
}
error_1og.warning ( "cannot locate employee: " + 1ast _name +
" , " + f irst_name ,;
throw new EmployeeNotFoundException( 1ast_name, first name , ;
II etc. , cada mt odo usa error_l og para registrar erros
Dia 6
A classe EmployeeDatabaseAccessor recebe um obj eto Basel og como argumento em seu constru-
tor. Uma instncia usar esse log para gravar todo e qualquer event o importante. Considere o
mtodo mainO a seguir:
public static void ma i n( Stri ng [] ar gs ) {
Baselog 10g new Screenlog ();
Emp l oyeeDatabaseAccessor eda = new EmployeeOa tabaseAccessor ( 10g ) ;
Employee emp eda. retri eveEmployee ( MEmployee" , M r . ~ )
}
Concebivelmente, o mtodo mai n() poderia passar qualquer subclasse de Ba sel 09 para Empl o-
yeeDatabaseAccessor. Um aplicat ivo poderia fazer o mesmo. EmployeeDatabaseAccessor
prova de futuro - no que di z respeito ao registro. Talvez no futuro voc precise de um arquivo
de log que funcione a cada 24 horas ou um que crie um nome de arquivo usando a data. Talvez
outro log faa registros em um manipulador de erros, que receba informaes da rede. Quem
pode ter certeza? Entretanto, com O polimorfismo de incluso, voc est pronlo.
Sem pol imorfismo de incluso, voc pred saria de um construtor para cada tipo de log que qui-
sesse fazer o accessor usar. Entretanto, isso no pra a. Voc tambm precisaria trocar cdigo
dentro do accessor. para que ele soubesse qual log deveria usar. Um objeto EmployeeOataba-
seAccessor que no usasse polimorfi smo, mas quisesse suportar mui tos logs di ferentes, poderi a
ser como segue:
publ i c class Empl oyeeOatabaseAccessor {
pr ivate Fllelog f il e_log;
pr ivate ScreenLog screen_l09;
private i nt log_type;
/ / a I gumas cons tantes ' tei s'
private f i nal static i nt FILE_LOG "O;
private final static i nt SCREEN_LOG " 1;
pu bl iC EmployeeDatabaseAccessor{ Filelog 109 ) throws InitDBException {
f ile_l og 109 ;
109_type FI LE_lOG;
inH();
}
publiC EmployeeDatabaseAccessor( Sc reenLog 10g ) throws Ini tOBException {
screen_l og log ;
l 09_type SCREEN_LOG:
i nH{):
}
publ i C Employee retrieveEmployee ( St r i ng f i r st_name . String last_name )
}
Polimorfismo: aprendendo a prever o futuro
throws EmployeeNotFoundExcept ion I
t ry {
}
II tenta recuperar o funcionr io
return nu11;
) catch( EmployeeNotFoundExcept ion ex ) I
if( 1og_type "" FIlE_lOG ) {
}
file_1og.warning( cannot locate employee: " +
last_name + ", " + first_name );
J else if ( log_type ~ SCREEN_lOG ) I
screen_1og.warning( "cannot locate employee: " +
last_name + ", " + first_name );
}
throw new EmployeeNotFoundException( last name , first name );
private vold lnlt () throws InitOBException {
try {
}
II ini cializa a conexo com o banco de dados
) catch( OBException ex ) {
}
if( log_type Fl LE_lOG ) {
file_log . fatal( "cannot access database : +
ex.getMessageO );
) else if ( log_type ... SCREEN_lOG )1
screen_log.fat al( cannot access database: M +
ex.getMessageO ) ;
}
throw new InitOBException( ex.getMessage(} );
II etc. Cada mtodo usa error_log para registrar erros
131
Voc precisar atual izar Emp 1 oyeeDa tabaseAccessor sempre que quiser adicionar suporte a um
novo log. Agora, qual verso voc gostaria de manter?
Polimorfismo paramtrico
o polimorfis mo paramtrico permite que voc crie mtodos e tipos genricos. Assim como o po-
limorlismode incl uso, os mtodos e tipos genricos pennitem que voc codifique algo uma vez
e faa isso trabalhar com muitos t ipos diferentes de argumentos.
Mtodos paramtricos
Embora o polimorfismo de incluso arete o modo como voc v um objeto, o polimorfi smo pa-
ramtrico areia os mtodos. O polimorfismo paramtrico pennite que voc programe mtodos
Dia 6
genricos retirando a referncia de declaraes de tipo de parmetro at o momento da execu-
o. Considere o mtodo a segui r:
lnt add(lnt a, i nt b)
add() recebe dois intei ros e retoma a soma. Esse mtodo mui to explcito; ele recebe dois intei-
ros como argumentos. Voc no pode passar dois nmeros reais para esse mtodo ou dois obje-
lOS matriz. Se voc tentar, obter um erro em tempo de compilao.
Se voc quiser somar dois nmeros reais ou duas matri zes, ento deve criar mtodos para cada
ti po:
Matrix add_matrix(matrix a, matrix b)
Rea l addJeal (real a, real b)
etc., para cada tipo que voc queira somar.
Seria conveniente se voc pudesse evitar ter de escrever mui tos mtodos. Primeiro, ter de escre-
ver muitos mtodos torna scus programas maiores. Voc precisar separar um mtodo para cada
tipo. Segundo, mais cdigo leva a mais erros e a mais manuteno. Voc no quer tornar a manu-
teno mais difcil do que precisa ser. Terceiro, ter de escrever mtodos separados no modela
add{) nat uralmente. E mais natural pensar apenas em tennos de add{) e no de add matrix() e
add_real ().
O polimorfismo de incluso apresenta uma soluo para o problema. Voc poderi a declarar um
ti po chamado addable, que teria um mtodo que soubesse como somar-se a outra instncia de
addable.
O t ipo poderi a ser como segue:
publ i c abs tract class Addable (
public Addable add(Addable) ;
J
O novo mtodo seria como segue:
Addable add_addable(Addable a, Addable b)
Return a.add(b)
NOTA
s vezes, o exemplo ant erior referido como polimorfismo de f unAo.
Est tudo bom, tudo bem. Voc s6 precisa escrever um mtodo para somar, entretanto o mtodo
funciona apenas para argumentos de Addabl e. Voc tambm precisa certi ficar-se de que os obje-
tosAddabl e passados para o mtodo sejam do mesmo tipo. Tal requisito propenso a erros e con-
trri o ao que a interface implica. De qualquer modo, voc realmente no resolveu o problcma
Polimorfis mo: aprendendo a prever o futuro 133
original. Voc ai nda precisar escrever mtodos para cada tipo que queira somar, que no seja do
ti po Addabl e. Nem tudo que voc desejar somar ser Addable.
a que o polimorfi smo paramtrico entra em ao. O polimorfis mo paramtri co permi te que
voc escreva um e apenas um mtodo para somar todos os tipos. O pol imorfismo paramtrico re-
tarda a declarao dos tipos dos argument os.
Considere o mtodo reescri to para ti rar proveito do polimorfi smo paramtri co:
,dd([T] " [T] b) , [T]
[T] um argumento exatamente igual a a e b. O argumento [T] especifica o tipo de argumento de
a e b. Declarando um mtodo dessa maneira, voc adi a a defini o do tipo dos argumentos at o
momento da execuo. Voc tambm notar que a e b devem ter o mesmo [T].
Internamente, o mtodo pode ser como segue:
[T] ,dd([T] " [T] b)
return a + bj
O polimorfis mo no mgico. Ele ainda espera que o argumento tenha determinada estrut ura.
Neste caso, qualquer argumento que voc passe dever definir + para esse tipo.
NOTA
Determinada estrutura pode ser a presena de certo mtodo ou operador cor-
retamente defi ni do.
Tipos paramtricos
Levado sua concluso extrema, o poli morfi smo paramtrico pode estender seu alcance aos
prprios tipos. Assim como os mtodos podem ter parmetros paramtricos, os ti pos podem ser
eles prprios paramtricos. Consi dere o TAO Queue defin ido no Dia 2:
Queue [T]
void enqueue([T])
[T] dequeue O
boolean isEmpty()
[T] ,oekO
O Queue um tipo parametrizado. Em vez de escrever uma classe de fil a para cada tipo que gos-
taria de enfilei rar, voc simplesmente especi fi ca os tipos de elementos que gostari a de enfi leirar,
para conter dinamicamente em tempo de execuo. Originalmente, voc poderi a dizer que o ob-
jeto Queue era um Queue de Object o Agora, oobjeto Queue pode ser um Queue de qualquer ti po.
Assi m, se voc quisesse annazcnar objctos Empl oyee, fari a a seguinte declarao:
Queue[Empl oyeel employee_queue = new Queue[Employee] :
Agora, quando voc usar Queue, s podem usar enqueue() e dequeue () nas inst,'i ncias de funcionrio.
Dia 6
Se ti pos paramtricos no forem possveis, voc precisaria escrever uma fil a separada para intei-
ros, outra para reais e ai nda outra para alienigenas do espao.
Em vez di sso, usando ti pos parametrizados, voc pode escrever o tipo uma vez, neste caso uma
fila, e usa- lo para cont er todos os tipos possiveis.
NOTA
Polimorfismo paramtrico soa bem no papet, mas h um problema: suporte.
Para aqueles que esto famitiarizados com Java, os exemplos anteriores po-
dem parecer estranhos. Na verso 1.3, a linguagem Java no tem suporte nati-
vo a t ipos parametrizados ou polimorfismo paramtrico em geral. Voc pOde
imitar tipos parametrizados, mas o preo na efi cincia bastante alto. Existem
algumas ext enses Java disponiveis para suporte a polimorfismo paramtri -
co, entretanto nenhuma delas foi oficialmente sancionada pela Sun.
A si ntaxe dos exemplos anteriores completamente inventada. Entretanto, ela
demonstra as idi as adequadamente.
Sobreposio
A sobreposio um tipo importante de pol imorfismo. Voc viu como cada subclasse de Pe r so-
nalityObject sobreps o mtodo speakO no incio deste dia. Ent retanto, voc vi u detalhada-
mente um exemplo ainda mais interessante de sobreposio e polimorfi smo no Dia 5.
Especificament e, considere as definics de classe MoodyObject e HappyObject :
publ l c class MoodyObject (
,
II retorna o humor
protected Stri ng getMood{) (
return "moody ";
,
II pergunta ao objeto como ele se sent e
public void queryMood() {
System, out.println("I feel " + getMood() + " today! ");
,
public cl ass HappyObject extends MoodyObject {
II redef i ne o humor da classe
protected String getMood() {
return "happy";
,
II especializao
public voi d laugh() (
Polimorfi smo: aprendendo a prever o futuro 135
Sys tem. out. pr; nt 1 n ("hehehe. .. hahaha... HAHAHAHAHAHA!!!!!");
}
}
Aqui, voc v que Ha ppyObject sobrepe o mtodo getMood() de MoodyObject. O interessante
que adefi ni o de MoodyObject de queryMood( ) faz uma chamada a getMood () internamente.
Voc notar que HappyObject no sobrepe o mtodo queryMood(). Em vez disso, HappyObject
si mplesmente herda o mtodo como um mtodo recursivo de MoodyObject. Quando voc chama
queryMood() em HappyObject , o poli morfismo da instncia garante a chamada da verso sobres-
crita de getMoodO em HappyObject, internamente.
Aqui, o pol imorfismo cuida dos detalhes do mtodo a ser chamado. Isso o libera de ter que rede-
fin ir queryMoodO, para que ele chame a verso correta de getMoodO.
Posteriorment e, voc viu como poderia tornar getMoodO abstrato na progenitora:
pub1ic abstract c1ass MoodyObject (
}
II retorna o humor
prot ected abst ract St r i ng getMood( ) ;
II pergunta ao objet o como el e se sente
publ ic void queryMoodO t
System.out.print1n( "I fee l " + getMoodO + " t oday!M);
}
Os mtodos abstralos so freqUentemente referidos como mtodos adiados, poi s voc retarda a
definio para as classes descendentes. Entretanto, assim como em qualquer outro mtodo, a
classe que define o mtodo abstraio pode fazer chamadas ao mtodo. Assim como os mlodos
sobrepostos, o polimorfi smo garantir que a verso correta do mtodo adiado seja sempre cha-
mada nas subclasses.
Sobrecarga
A sobrecarga, tambm conhecida como polimorfismo ad-llOc, permite que voc use o mesmo
nome de mtodo para muitos mtodos diferentes. Cada mtodo difere apenas no nmero e no
tipo de seus parmetros.
Considere os mtodos a segui r, definidos em java.1ang.Math:
pub1i c sta tic int max(i nt a, int b) ;
publ i c stat ic 10n9 max( long a, 10n9 b):
public stati c fl oat max(float a, float b) :
pu bl i c stat ic double max(doubl e a, doubl e b) ;
Dia 6
Os mtodosmax () so todos exemplos de sobrecarga. Voc notar que os mtodosmax( ) di ferem
apenas no ti po de parmetros.
A sobrecarga lIt il quando um mtodo no defi ni do por seus argumentos. Em vez disso, o m
todo um conceito independente de seus argumentos. O mtodo transcende seus parmetros es-
pecificas e se aplica a muitos tipos di ferent es de parmetros. Peguemos o mtodo max (). max ()
um conceito genrico que recebe dois parmetros e informa qual maior. Essa defini o no
muda se voc comparar int ciros, n(mlcros com ponto fl ut uante, valores duplos ou a ordem da bi
cada de um bando de pssaros.
A operao + out ro exemplo de mtodo sobrecarregado. O conceito + independent e de seus
argumentos. Voc pode somar todos os tipos de element os.
NeTA
Voc no pode SObrecarregar ou sobrepor operadores na linguagem Java; en-
tretant o, a l inguagem Java tem alguma sobrecarga int erna.
Se a sobrecarga no fosse possvel , voc teria que fazer o seguinte:
publ ic sta t i c i nt max_l nt( lnt a. int b }i
publ i c stati c 10ng max_longe 10ng a. 10ng b ) i
pub1i c stat i c f loat max_fl oat( fl oat a, floa t b ) i
publ i c sta tic doub1e max_doubl e( double a, doubl e b }i
publ i c stat ic bi rd max_b i rd ( bi rd a. bi rd b l i
Sem a sobrecarga, voc deve dar a cada mtodo um nome exdusivo. Os mtodos ma x () no
transcenderi am mais seus parmetros. Max deixari a de ser um conceito abstrato. Em vez disso,
voc teri a de defi nir o mtodo em tennos de seus argumentos. Ter de cscrever o mtodo ma xO
dessa maneira no um jeito natural de modelar o conceito de max (). Isso tambm fornece ao
programador mais deta lhes para ter em mente.
,
E daro que chamar cada mtodo com um nome diferent e no polimrfi co. Quando todos os
mtodos comparti lham o mesmo nome, voc obtm comportament o polimrfi co, pois diferen
tes mtodos so chamados internamente, dependendo dos ti pos de parmetros passados. Voc
pode simplesment e chamar max () e passar seus parmetros. O poli morfi smo cuidar de chamar a
mtodo correto internamente.
O modo como o polimorfi smo direciona a chamada de mtodo dependc da linguagem. Algumas
linguagens solucionam a chamada de mtodo durante a compilao, enquant o OUl ras vinculam a
chamada de mtodo dinamicamente, em tempo de execuo.
Po limo rfismo: aprendendo a prever o futuro 137
Converso
Converso e sobrecarga freqentement e andam lado a lado. A converso tambm pode fazer
com que um mtodo parea como se fosse polimrfico. A converso ocorre quando um argu-
mento de um ti po convenido para o tipo esperado, intemamenle.
Considere a definio a seguir:
public f1 0at add( f10at a, f10at b );
add() recebe dois argumentos float e os soma.
O segmento de cdigo a seguir cria algumas variveis inteiras e chama o mtodo addO:
int iA " 1;
int i B 2:
add(iA,iB);
,
Entretanto, o mtodo add() solicita dois argument os float. E a que a converso entra em ao.
Quando voc chama add () com argumentos i nt, os argumentos so convcnidos em valores f10-
a t pelo compilador. J sso signi fica que, antes que os argumentos i nt sejam passados para add (),
primeiro eles so convert idos em valores f1 oat. Os programadores Java reconhecero essa con-
verso.
Assi m, a converso faz o mtodo addO parecer polimrfico, pois O mtodo parece funci onar
para valores f 1 oa t e int. Conforme voc vi u na lti ma seo, tambm seria possivel ter um m-
todo add sobrecarregado, da forma:
pub1ic int add(1nt a, 1nt b);
Nesse caso, add (i A, 1 B) no resultaria em converso. Em vez disso, o mtodo add () corretamen-
te sobrecarregado seria chamado.
Polimorfismo eficaz
Assim como todos os outros pil ares, o polimorfismo eficaz no acontece por acidente. Existem
alguns passos que voc pode executar para garantir um pol imorfi smo eficaz.
O primeiro passo para o polimorfi smo eficaz ter encapsulamento e herana eficientes.
Sem encapsulamento seu cdigo se torna facil mente dependente da implementao de suas clas-
ses. No pcnnita que o encapsulamento seja destruido. Se o cdigo se tornar dependente de al-
guns aspectos da implementao de uma classe, voc no poder conectar uma subclasse que
refaa essa implementao. Um bom encapsulamento o primeiro passo para o polimorfi smo.
Dia 6
imponante notar que, nesse contexto, interface um pouco di ferent e da no-
o de interfaces Java, embora sejam semelhantes. Aqui , o termo interface
usado para descrever a lista de mensagens que voc pode enviar para um ob-
j eto. Todas essas mensagens compreendem a interface pbli ca de um objeto.
Uma interface Java tambm define as mensagens que voc pode enviar para
um objeto Java. Quando uma classe Java implementa uma interface, todos os
mtodos da int erface se tornam pane da interface pbl ica global da classe.
Enlretanto, a int erface Java no a nica maneira de def inir as mensagens que
voc pode enviar para um objeto. Na li nguagem Java, qualquer mtodo pbli-
co definido na definio da cl asse se tornar pane da interface pblica do obje-
to. Isso significa que. se uma classe implementar uma interface e definir
mtodos pbli cos adicionais. os dois conjuntos de mtodos se tornaro parte
de sua interface pbli ca.
Usar interfaces Java ao programar considerada uma boa prt ica, pois isso
separa a definio da interface da implementao da classe dessa interface.
Quando voc separa as duas, muitas classes de outro modo no relacionadas
poderiam implementar a mesma interface. Assim como a herana, os objetos
que compartil ham uma interface comum tambm podem tomar parte em rela-
ci onamentos com capacidade de substituio, mas sem ter de fazer parte da
mesma hi erarqui a de herana.
A herana um fator importante no polimorfi smo de incluso. Sempre tente estabelecer relacio-
namentos com capacidade de substituio programando o mais prximo possvel da classe base.
Essa prtica penniti r que mais tipos de objelos participem de seu programa.
Um modo de estimular a capacidade de substit uio atravs de hierarquias bem pensadas.
Mova as caractersticas comuns para classes abst raias e programe seus obj etos para lIsar a classe
abstrata e no uma descendente concreta especfi ca. Desse modo, voc poder int roduzir qual-
quer descendente em seu programa.
DICA
Para obter um poli morfis mo eficaz, siga estas dicas:
Siga as dicas do encapsulamento e da herana efi cazes.
Sempre programe para a interface e no para a implementao. Progra-
mando para uma interface, voc define especi fi camente quais tipos de ob-
j etos podem participar de seu programa. Ento. o pOlimorfismo garantir
que esses objetos participem corretamente.
Pense e programe genericamente. Deixe o polimorfi smo se preocupar
com os det alhes especificos. Se voc deixar o pOlimorfi smo fazer seu tra-
balho. no preci sar escrever muito cdigo. El e cuidar dos detalhes para
voc!
Defina a base do polimorfismo estabelecendo e usando relacionamentos
com capaci dade de substitui o. A capacidade de substitui o e o poli -
morfismo garanti ro que voc possa adi cionar novos subti pos em seu
programa e que o cdigo corret o ser executado, quando esses sUbt ipos
forem usados.
Polimorfismo: aprendendo a prever o futuro 139
Se sua linguagem fornece uma maneira de separar completamente a in-
terface e a implementao, favorea esse mecanismo em detri mento da
herana. Um exemplo de mecanismo que permite definir e herdar interface
sem i mplement ao a Java Int erface. Separar os dois permite uma capa-
cidade de substituio mais fl exvel, obtendo-se assim mai s oport uni dade
de polimorfismo .
Use classes abstratas para separar a interface da implementao. Todas
as classes no-folha devem ser abstratas; programe apenas para essas
classes abstratas.
A discusso anteri or focalizou muito as linguagens fortemente tipa das, como Java. Em
uma linguagem fortemente tipada, voc deve deciarar explicitamente o tipo de uma
varivel. Entretanto, algumas linguagens orientadas a objetos, como Smalltalk. no
tm esse requi sito. Em vez disso, tais linguagens so dinamicamente tipadas. Tipagem
dinmica signifi ca que voc no precisa indicar explicitamente o tipo de uma varivel,
ao cri-Ia. Em vez di sso, o tipo determi nado dinamicamente, em tempo de execuo.
Assim, basicamente, toda varivel polimrfi ca.
O poli morfismo um pouco mais simples em linguagens dinami camente tipadas. As
variveis so automaticamente pol imrficas, pois elas podem conter qualquer valor.
Desde que o objeto tenha o mtodo esperado, ele pode trabalhar de forma pOlimrfica.
E claro que tudo ser destruido, se voc tentar chamar um mtodo que no existe!
As l inguagens ti padas so um pouco mais rigorosas. As linguagens di namicamente ti -
padas permit em que voc t rat e um obj eto de forma polimrfica, desde que ele tenha o
mtodo em que voc est interessado. O objeto no precisa pertencer a uma hierar-
qui a de herana especifica. As li nguagens f ortemente tipadas exigem que o objeto per-
t ena a uma hierarquia de herana especif ica.
Entretanto, os dois casos no so to diferentes assim. O comportamento que real
mente define um tipo; as linguagens tipadas exigem apenas a presena de todos os
comportamentos definidos. Assim, os concei t os por trs do polimorfismo em lingua
gens fortemente tipa das e dinmicas so os mesmos. Tudo se reduz a um objeto que
sabe como executar algum comportamento.
O f oco nas linguagens ti padas deliberado. Focalizar diretamente a forte tipagem o
obriga a se concentrar no tipo, sem perder os detalhes. Se voc pode entender o poli-
morfismo em uma linguagem tipada, ento certamente pode entend-lo em uma lin-
guagem no tipada. O inverso parece no ser verdadeiro I
A escolha de focalizar o tipo tambm pragmtica. A maioria das princi pais l ingua-
gens orientadas a objetos fortemente tipada.
Armadilhas polimrficas
Ao se usar polimorlismo, existem trs annadil has pri ncipai s a serem evitadas.
Dia 6
Armadilha 1: mover comportamentos para cima na
hierarquia
Mui to freqUentemente, desenvolvedores inexperientes movero comjX)rtamentos para cima na
hierarquia, para aumentar o pol imorfismo. O ent usiasmo em tratar tudo de maneira poli mrfica
pode cegar faci lmente um desenvolvedor e resul tar em hierarquias mal projetadas.
Se voc mover um comportamento para cima demais em uma hierarquia, nem todos os descen-
dentes podero suportar o comportamento. Lembre-se de que os descendentes nllnca devem reti-
rar funcionalidade de seus ancestrais. No dest rua uma boa herana para tornar seus programas
mais pol imrficos.
Se voc tiver vontade de mover comportamentos para cima na hierarquia, unicamente para me-
lhorar o polimorfismo, pare. Voc est em territrio perigoso.
Se voc encontrar limi taes demais em sua hierarquia, talvez queira rev-I a. Mova elementos
comuns para classes abstratas; mova funcional idade por toda parte. Ent retanto, no mova mto-
dos para cima na hi erarq uia, alm do nvel onde eles so necessrios pela primeira vez. Nilo se
habi tue a mover comport amentos por capri cho, simplesmente para adicionar suporte polimrfi-
co. Certifique-se de que voc tenha out ro moti vo vlido para a mudana. Voc pode ter sorte al-
gumas vezes. mas a prtica o pegar posteri ormente, e maus hbi tos de programao so dificeis
de perder.
Ao desenvolver suas hierarquias, importante considerar a evol uo em potencial das classes,
com o passar do tempo. Voc pode di vi dir a hierarquia em nveis funcionai s. Com o passar do
tempo, voc pode evoluir sua hierarquia, adicionando novos n veis funciona is, quando eles fo-
rem necessrios. Entretanto, voc s deve especular com base nos requi si tos fut uros que conhe-
ce. Exi ste um nmero inl1nito de 'e se' indefi nidos. Planeje apenas as eventua li dades que voc
conhece.
Armadilha 2: sobrecarga de desempenho
Tudo tem um preo. O verdadei ro polimorfismo sofrer certa sobrecarga de desempenho. O po-
limorfismo no pode competir com um mtodo que conhece seus argumentos estaticamente. Em
vez di sso, com o polimorfi smo, devem haver verificaes em tempo de execuo. Para o poli-
morfi smo de incluso, a implementao real do objeto para o qual voc envia mensagens deve
ser determinada em tempo de execuo. Todas essas veri ficaes levam tempo para terminar e
so mais lentas em comparao aos valores que conhecem seus ti pos estati camente.
As vantagens da manuteno e da nexibilidade do programa devem compensar qualquer perda
de desempenho. Ent retanto, se voc estiver escrevendo um apli cativo em que o tempo seja im-
portante, talvez precise tcr cuidado ao usar pol imorfismo. Entretanto, mantenha o desempenho
em perspectiva. Cri e uma implementao 00 limpa, trace o perfil da implementao e oti mi ze
cui dadosamcnte o desempenho, onde o traado do perfil revela problemas.
Polimorfi smo: aprendendo a prever o f uturo 141
Armadilha 3: vendas
o polimorfi smo de incl uso tem uma defi cincia. Embora seja verdade que voc pode passar
uma subclasse para um mtodo que est esperando uma classe base. o mtodo no pode tirar pro-
veito de todos os novos mtodos que a subclasse possa adicionar em sua interracc. Porcxcmplo,
a classe Fi 1 elog adiciona um mtodo c1oseO em sua interface. O mtodo retrieveEmpl oyeeO
de EmployeeOatabaseAccessor no poder uslo. Um mtodo programado para acei tar a classe
base s saber manipular a interrace da classe base.
A Figura 6.2 mostra como a visual izao de uma instncia relat iva. Optar por ver uma instncia
de Fi 1 eLog como se fosse uma instncia de BaseLog corno colocar vendas nos olhos. Voc s
tem acesso aos mtodos declarados em BaseLog. claro que, se voc tratar da instncia de Fil e
Log como uma instncia de Fi 1 eLog, obter toda a funcionalidade definida ou herdada pela classe
Fi 1 eLog, como aconteceria normalmente.
FIGURA 6 .2
Di/erellles l"iscs
do mesmo objero.
.
Basel og bI '" new FileLogl'file')
BllseLog II '" new FileLogl'fi le'):
Baselog
debugU
InfoU
wll mingU
error()
fetaltl
FileLog
loseU
,
,
,
,
InlJl.lnjll de
Filel og
, "-----'= '--'
,
Assim, quando voc adicionar novos tipos de fonna polimrfica, seu cdigo antigo no poder
usar nenhum dos mtodos novos. Ent retant o, o novo cdigo (ou o cdigo atua li zado) est livre
para usar qualquer coisa na inlerrace pblica.
Novamente, essa armadilha aponta o moti vo pelo qual um descendente nunca deve remover
componament os de seu progenitor. Um mtodo que conte com o polimorfismo de incluso s
saber como exercer os mtodos defin idos com o ti po que estiver programado para manipular.
Se estiver faltando um comportamento, o mtodo no funcionar.
Essa armadil ha tambm mostra que simplesmente trocar para um novo tipo em seu programa j
existente, freqUentemente no to fcil quanto poderia parecer. No exemplo do Fi 1 eLog, voc
preci sar encontrar um modo de chamara mtodo cl ose(), quando seu programa tiver termina
do com o log.
Dia 6
Advertncias
Existe uma advenncia imponant e a ser lembrada ao se considerar o polimorfi smo. Cada lin-
guagem implementa o polimorfismo de uma fonna diferente. Esta discusso esboou as defi ni -
es tericas por trs do poli morfi smo.
A maioria, se no todas as linguagens, supona polimorfismo de incl uso em algum grau. Por ou-
tro lado, poucas suponam o verdadeiro poli morfi smo paramtrico. A linguagem Java cenamen-
te no supona polimorfi smo paramtrico. C++ fi nge implement-lo.
A maioria das linguagens tem alguma forma de sobrecarga e converso. Entretanto, a implemen-
tao exata vai vari ar de uma linguagem para outra.
Assim, quando voc comear a programar de fonna poli mrfi ca, lembre-se da teoria, mas pros-
siga cuidadosamente. Voc no pode evitar as I im itaes de sua I inguagem de impl ementao.
Como o polimorfismo atende os objetivos
da 00
o polimorfismo atende cada um dosobjetivosda poo. O polimorfi smo produz software que:
1. Natural
2. Confivel
3. Reut ilizvel
4. Manut envel
5. Extensvel
6. Oportuno
O polimorfi smo atende esses objet ivos das seguintes maneiras:
Natural: o poli morfi smo permite que voc modele o mundo mais nattlr'dlmente. Em vez
de programar para casos especiais, o pol imorfis mo permite que voc trabalhe em um n-
vel mais genrico e conceit uaI.
A sobrecarga e o polimorfi smo paramtrico permitem que voc modele um objeto ou m-
todo em nvel conceituai do que esse objetoou mtodo faz e no de quais tipos de parme-
tros ele poderia processar. O polimorfi smo de incluso permite que voc manipule tipos
de objetos, em vez de implementaes especficas.
Tal programao gencri ca c mais natural, pois ela o libera para programar no nvel
concei tuai do problema e no nas implementaes especficas.
Confivel: o poli morfismo resulta em cdigo confi vel.
Polimorfismo: aprendendo a prever o futuro 143
Primeiro, polimorfismo simpl ifica seu cdigo. Em vez de ter de programar casos espe-
ciais de cada tipo de objeto que poderia manipular, voc escreve simplesmente um caso.
Se voc no pudesse programar dessa maneira, teria de atualizar seu cdigo sempre que
adicionasse uma nova subclasse. Ter de atualizar cdigo algo propenso a erros.
Segundo, o polimorfismo pennite que voc escreva menos cdigo. Quanto menos cdigo
voc escreve, menores as chances de introduo de erros.
O polimorfismo tambm pennite que voc isole partes do cdigo das alteraes das sub-
classes, garantindo que elas tratem apenas com os nveis da hierarquia de herana impor-
tantes para sua funo.
Reutilizvel: o polimorfismo auxilia a reutili zao. Para que um objcto use outro, ele s
precisa conhecer a interface do segundo objeto e no os detalhes da implementao.
Como resultado, a reutilizao pode ocorrer mai s prontamente.
Manutenvel: o polimorfismo auxilia a manutenibilidade. Conforme voc j viu, o poli-
morfismo resulta em menos cdigo. Assim, h menos para manter. Quando voe precisa
manter cdigo, no obrigado a manter grandes estruturas condicionais.
Extensvel: o cdigo poli mrfico mais extensvel. O poli morfi smo de incluso permite
que voc adicione novos subtipos em seu sistema, sem ter de alterar o sistema para usar o
novo subtipo. A sobrecarga permite que voc adicione novos mtodos, sem terde se preo-
cupar com conflitos de atribuio de nomes. Final mente, o polimorfismo paramtrico
pennite que voc estenda automaticamente suas classes, para suportar novos ti pos.
Oportuno: o pol imorfismo oajuda a escrever cdigo oportuno. Se voc pode escrever me-
nos cdigo, ento pode distribui r seu cdigo mais cedo. Como o polimorfismo o estimula
a programar genericamente, voc pode adicionar novos tipos quase que instantaneament e
em seus programas. Como resultado, a manuteno e a extenso de seus programas ocor-
re em um ritmo muito mais rpido.
Resumo
Polimorfi smo ter muitas formas. O polimorfismo um mecanismo que permi te a um nico
nome representar cdigos diferentes. Como um ni co nome pode representar cdigos diferentes,
esse nome pode expressar muitos comportamentos diferentes. O polimorfi smo permite que voc
escreva cdigo humorado: cdigo que exibe diferentes comportamentos.
Para os objetivos deste li vro, voc aprendeu a respeito de quatro diferentes tipos de polimorfismo:
Polimorfismo de incluso
Polimorfi smo paramtri co
Sobreposio
Sobrecarga
Dia 6
Embora exista cert o desacordo em relao ao polimorfismo na comunidade de 00, esses tipos
descrevem algumas das fonnas mais comuns de pol imorfi smo. Entender esses tipos proporcio-
nar a voc uma boa base na teoria de polimorfismo.
O pol imorfismo de incluso permi te que um objeto expresse muitos comport amentos diferentes,
em tempo de execuo. Do mesmo modo, o pol imorfi smo paramtrico permite que um obj etoou
mtodo opere com vrios tipos de parmetro diferentes.
A sobrepos io permi te que voc sobreponha um mtodo e saiba que o polimorfi smo garantir
que o mtodo correto sempre ser executado.
Fi nalmente, a sobrecarga pennite que voc declare o mesmo mtodo vrias vezes. Cada declarao
difere simplesmente no nmero e no ti po de argumentos. A converso faz um mtodo parecer pol i-
mrfico, convertendo argumentos nos tipos de argumentos esperados pelo mtodo.
O polimorfismo permite que voc escreva cdigo mais curto e mais inteligivel, que tambm
mais flexvel para os requisitos futuros.
Perguntas e respostas
P Existem trs pilares na programao orientada a objctos. Se cu no usar todos os
trs, meu software nllo ser OO?
R No minimo, voc sempre deve usar encapsulamento. Sem encapsulamento, voc real-
mente no ter herana eficaz, polimorfi smo ou 00 em geral. Quanto aos out ros dois pi-
lares, voc s deve us- los quando fi zer sent ido. No use herana ou polimorfismo
apenas para que voc possa dizer que os uti lizou em seu programa.
A ausncia de herana e polimorfismo no significa que um programa necessariament e
no-OO. Entretanto, voc precisa dar uma boa olhada em seu programa, para ver se est
desperdi ando uma oportunidade de lIsar corretament e os outros pilares.
P Por que existe tanto desacordo cm relao ao polimorfismo na comunidade de OO?
R H muito desacordo na literatura que ainda precisa ser acertado. Parece que cada autor
tem seu prprio vocabulrio. Grande parte desse desacordo provm do fato de que cada
linguagem implementa o polimorfismo de sua prpria manei ra. Todas essas diferentes
implementaes tm di vidido a comuni dade.
O important e que voc ent enda os quatro tipos apresentados hoje. Embora eles possam
receber nomes diferentes, esses quatro tipos so bastant e reconhecidos.
P A linguagem Java vai suportar polimorfismo paramtrico?
R Somente a Sun pode responder essa pergunta. Entretanto, atualmentc existe um Java
Specificat ion Request (JSR-OOOO 14), que foi aceito para desenvolvimento. Ele acrescenta ti-
pos genricos na linguagem de programao Java. Assim, a coisa est a caminho!
Polimorfismo: aprendendo a prever o futuro 145
Workshop
As perguntas e respostas do teste so fornecidas para seu melhor entendimento. Veja as respos-
tas no Apndice A, "Respostas".
Teste
I. Quais so os quatro tipos de polimorfi smo?
2. O que o poli morfismo de incluso permite que voc faa?
3. Como a sobrecarga e o polimorfi smo paramtrico modelam mais naturalmente o mundo
real?
4. Ao programar, por que voc deve programar para uma interface, em vez de para uma im-
plementao?
5. Como o polimorli smo e a sobreposio trabalham j untos?
6. Qual outro nome para sobrecarga?
7. Defi na sobrecarga.
8. Defi na polimorfis mo paramtrico.
9. Quais so as trs armadilhas associadas ao pol imorfi smo?
10. Como o encapsulament o e a herana afetam o polimorfismo de incluso?
Exerccios
I. D um exemplo real de sit uao de programao onde voc acha que poderia usar poli-
morfi smo de incluso. Pode ajudar pensar em algo que voc tenha programado ant erior-
mente, que pudesse ti rar proveito do pol imorfi smo.
2. D um exempl o de converso. Explique por que se trata de converso.
3. Examine as APl s Java. Encontre um exempl o de sobrecarga e explique-o. Em seguida,
encontre uma hierarquia de classes que voc poderia destacar para polimorfi smo de in-
cluso. Identi fiq ue a hierarqui a e explique como voc pode aplicar polimorfismo de in-
cluso nela.
SEMANA 1
DIA
Polimorfismo: hora de escrever
algum cdigo
Ontem, voc aprendeu a respeito do polimorfi smo. Voc deve ter um bom entendi mento dos
quatro diferentes tipos de polimorfismo. Hoje, voc ganhar experincia prtica com o polimor-
fi smo, alravs de vri os exerccios de laboratri o. No final da lio de hoje, voc dever se sentir
vontade com a teoria apresentada no Dia 6, "Polimorfismo: aprendendo a prever o futuro",
Hoje voc aprender:
Como aplicar as diferentes formas de polimorfismo
Como escrever software prova do futuro
Como o polimorfi smo pode ajud- lo a evitar a troca da lgica
laboratrio 1: aplicando polimorfismo
No Dia 5, o Laboratrio 2 apresentou uma hierarquia de funcionri os. A Listagem 7.1 apresenta
uma classe base E111> loyee ligeiramente alterada.
LISTAGEM 7.1 Empl oyee . j ava
publi C abstracl class Employee {
private String f i rst_name ;
private String last _name ;
1 148 Dia 7
LI STAGEM 7. ' Empl oyee. java (continuao)
}
pri va te double wage :
public Empl oyee ( Stri ng first_name. String last_name . double wage ) I
this.first_name = first name;
this . last name z last name;
this.wage wa ge :
}
public double getWage() {
return wage:
}
public String getFirstName() {
return first_name;
}
publ iC Str ing getlastName() {
return last_name :
}
publiC abstract double calculatePay( ) ;
public void printPaycheckO I
}
String full_oame " l ast_name + lO, " + first_name ;
System. out. pr i nt l n( "Pay: M + full _name + " $" + cal cul atePay() ):
A nova classe Empl oyee tem agora um mtodo abstrato ca 1 cul atePay() . Cada subclasse deve de-
fini r sua prpria i mplementao de ca 1 cu 1 atePay (). As listagens 7.2 e 7.3 apresentam duas pos-
sveis subclasses.
LI STAGEM 7.2 Corrmi ss ionedEmp loyee.java
publ i c cl ass CommissionedEmployee extends Employee {
private double
private int
conmi ss i on :
units:
I I o custo por uni dade
II controla o nmero de unidades vendidas
publiC CommissionedEmployee ( String first_name . String last_name .
double wage , double conmission ) {
super ( first_name . l ast_name. wage ):
II chama o const rutor original para inicializar corret amente
Polimorfi smo: hora de escrever algum cdigo
LI STAGEM 7.2 Colt'lt1i ss ionedEmployee.java (continuao)
}
}
}
}
thlS.commissi on = commission;
public double calculatePay() (
return getWage() + (commission * units );
}
pub11C void addSales( int units ) {
th1s.unlts thiS.units + un1ts;
publiC lnt getSales() {
return units;
public void resetSales() {
unit s O;
}
LISTAGEM 7.3 HourlyEmpl oyee.java
public class HourlyEmployee extends Employee (
}
pri vate int hours; II controla o nmero de horas trabalhadas
publiC HourlyEmployee ( String first_name. String last name .
double wage ) {
supere first_name . last_name, wage );
II chama o construtor original para i nicializar corretamente
public double calculatePay() {
return getWage()* hours ;
}
publlc void addHours( int hours ) {
this.hours this.hours + hours;
}
public int getHours() {
return hoursj
149
1 150 Dia7
LI STAGEM 7.3 HourlyEmployee.java (continuao )
I
I
public void resetHours() I
hours = O;
I
Cada subclasse fornece sua prpria implementao de cal cul atePay(). HourlyEmployee sim-
plesmente calcula o pagamento multipl icando as horas lI balhadas pela taxa horria. Um objeto
Conm; ss; onedEmp 1 oyee recebe o salrio-base, mais um bnus por cada unidade vendida. Cada
subclasse tam bem adiciona alguns mtodos prprios. Por exemplo, Hour I yEmp 1 oyee tem um m-
todo para reconfigurar as horas. Do mesmo modo, Conmiss i onedEmployee tem um mtodo para
adicionar vendas.
Conforme voc aprendeu no Dia 4, " Herana: hora de escrever algum cdigo", Conmi ssio-
nedEmployee e HourlyEmployee permitem que as instncias das duas classes compartilhem um
relacionamemo com capacidade de substituio. Voc pode usar uma instncia de Conmi ss io-
nedEmp loyee ou uma instncia de HourlyEmployee, em lugar de Emp l oyee. Entretanto, o que o per
li morfi smo permite fazer?
Considere a classe Payroll, apresentada na Listagem 7.4.
LISTAGEM 7.4 Payr oll. java
public class payroll I
private int
private int
private double
total_hours;
t otal_sales ;
total_pay;
public void payEmployees( Employee (] emps ) I
I
for( int i O; i < emps . length; i ++ ) {
Emp l oyee emp = emps [i];
I
total_pay +z emp.calculatePay{) ;
emp.printPaycheck();
publi c void recordEmployeeln fo( CommissionedEmployee emp ) (
total_sales += emp.getSales() ;
I
publiC void recordEmployeelnfo( Hourly6mployee emp ) I
total _hours +- emp.getHours();
Polimorfismo: hora de escrever algum cdigo 151
LISTAGEM 7.4 Payroll. java (continuao)
}
}
public void pri ntReport() I
}
System.out.pr int ln( "Payroll Report:" ) ;
System.out.println( "Total Hours: " + total _hours ) ;
System.out.println( "Total Sales: " + total_sales ) ;
System.out.print ln( "Total Paid: $" + total_pay );
ALERTA
Mtodos get e set em demasia indicam um mal projeto 00. Em geral, voc
quer solicitar os dados de um objeto muito raramente. Em vez di sso, voc deve
pedir para que um objeto faa algo com seus dados.
No exemplo de funcionrios, ter ia sido uma 00 melhor se passasse para o ob
jeto Emp 1 oyee um objeto Report, onde ele pudesse registrar suas horas. vendas
etc. Embora isso fosse uma 00 melhor, teria se desviado do exemplo.
A 'boa 00' tambm relativa. Se voc esti ver escrevendo objetos genri-
cos que sero usados em mui tas situaes diferentes, talvez queira adicio-
nar mtodos get / set. para que possa manter a interface da classe fci l de
ger enciar.
Considere o mtodo payEmployees( Employee [] emps ). Os relacionamentos com capacidade
de substituio permitem que voc passe qualquer subclasse de Emp I oyee para o mtodo. Geral-
mente, esse mtodo trata objetos HourlyEmpl oyee e CorrmissionedEmployee como simples instn-
cias de Employee.
O polimorfismo o que torna esse exemplo interessante. Quando os mtodos payEmployeesO
dizem
total_pay += emp.calculatePay()
o polimorfismo faz parecer que Employee tenha muitos comportamentos diferentes. Quando
emp.ca I cul atePay() chamado em um objeto que realmente um HourlyEmp loyee, ca I cul ate-
PayO calcula o pagamento, multipl icando a taxa horria pelo nmero de horas trabalhadas. Do
mesmo modo, quando a instncia subjacente um objeto Conmiss i onedEmployee . calcul ate-
pay() retorna o salrio mais todos os bnus de vendas.
payEmployeesO um exemplo de polimorfismo de incll/so. Esse mtodo funciona para qual-
quer funcionrio. O mtodo no precisa de cdigo especial, voc no precisar alual iz-Io cada
vez que adicionar uma nova subclasse em seu sistema - ele si mplesmente funciona para todos
os objetos Emp I oyee.
Dia 7
Mtodos como
recordEmployeelnfo( CommlsslonedEmpl oyee emp )
e
recordEmployeelnfo( Hour1 yEmployee emp )
demonstram a sobrecarga. A .wbrecarga permite que um mtodo parea ser polimrfico. Por
exemplo, ela permite o seguinte:
Payroll payroll new Payrol1() ;
Commi ssionedEmployee empl = new Corrmi ssionedEmployee( "Mr. ". "Sales ".
25000.00 , 1000.00);
Hou r1 yEmp1oyee emp2 new HourlyEmployee( "Mr." , "Minimum Wage" , 6.50 ) ;
payroll.recordEmp loyeelnfo( emp2 ) ;
payroll . recordEmp10yeelnfo( emp l ) j
recordEmp 1 oyee I n fo () parece ser pai imrfico. pois pode manipular os dois tipos de funcionrio.
A sobrecarga um pouco mais limitada que o polimorfismo de incluso. Com o polimorfismo de
incl uso, voc viu que precisava apenas de um mtodo, payEmpl oyees(), para calcular o paga-
mento de qualquer objeto Emp 1 oyee. I ndependentemente de quantas subclasses de Emp 1 oyee voc
introduza, o mtodo sempre funcionar. Esse o poder do pol imorfi smo de incl uso.
Os mtodos que empregam sobrecarga no so to robustos assim. Pegue como exemplo o m-
todo recordEmp loyeelnfo(). Sempre que voc adicionar uma nova subclasse na hierarquia
Empl oyee, ter de adicionar um novo mtodo recordEmp1oyeelnfo() para o novo tipo. Embora
alguns mtodos extras possam ser aceitvei s para uma hierarquia pequena, talvez voc tenha de
refazer sua hierarquia, para que possa escrever um mtodo recordEmpl oyee lnfo() genrico,
quando o nmero de subclasses de Employee aumentar.
A Listagem 7.5 fornece um pequeno mtodo principal que executa os mtodos Payroll.
LISTAGEM 7.5 Payro 11 Dri ver . java
publi C cl ass PayrollDri ver (
publi c static vOl d maln( String [J args ) (
II cr ia o sistema de fo lha de pagamento
Payroll payrol1 = new Payrol l () ;
II cria e atuallza alguns funcionrios
COIlI1lissionedEmp1oyee emp l - new Corrmi ssionedEmployee( "Mr.", "Sal es ",
25000.00 , 1000. 00),
CommissionedEmpl oyee emp2 new COIl1ll i ssionedEmp1oyee( "Hs." , "Sales - ,
25000. 00, 1000.00),
empl . addSales( 7 );
emp2. addSales( 5 );
Polimo rfi s mo: hora de escrever algum cdi go 153
LISTAGEM 7.5 Payro110river . java (continuao)
I
I
HourlyEmployee emp3 .. new Hour l yEmployee( "Hr . ", "Hinimum Wage" , 6.50 ) ;
HourlyEmployee emp4 .. new Hour l yEmployee( "Hs." , "Hini mum Wage" , 6.50 );
emp3 . addHours( 40 ) ;
emp4.addHours( 46 );
II usa os mtodos sObr eca rregados
payroll.recordEmployeeI nfo( emp2 ) ;
payroll.recordEmployeel nfo( emp l ) ;
payroll.recordEmployeel nfo( emp3 ) ;
payroll.recordEmployeel nfo{ emp4 );
II coloca os em um array
Empl oyee [] emps new Empl oyee [4];
emps[O] .. empl; emps [l] " emp2 ; emps [2] = emp3 ; emps[3] .. emp4;
payroll. payEmployees ( emps ) i
payroll.printReport() j
A Figura 7. 1 mostra a sada do mtodo pri ncipal.
FIGURA 7.1
A Si/ida correia de
Payro 11 Ori ver.
Se voc percorrer o cdigo e calcular manual mente o pagamento de cada funci onrio, ver que
payEmp 1 oyees () paga o valor correiO. Do mesmo modo, todas as infonnaes de funcionrio so
correlamente gravadas.
Dia 7
Exposio do problema
No Dia 5, voc trabalhou com obj etos MoodyObject. A Lis tagem 7.6 apresenta uma classe
HoodyObject ligeiramente modificada.
LISTAGEM 7.6 MoodyObject . java
publiC abstract class MoodyObject (
I
II retorna o humor
protected abstract String getMood() ;
II pergunta ao objeto como ele se sente
publ ic void queryMood() (
System.out.println( " I feel " + getMood() + " today!!") :
I
As listagens 7.7 e 7.8 apresentam duas subclasses: HappyObject e SadObject.
LI STAGEM 7.7 HappyObject . java
public class HappyObject extends MoodyObject (
I
Il redefine o humor da classe
protected String getMood() I
return "happy;
I
Ilespecializao
public void laugh() {
Sys tem. ou t. pri nt l n (" hehehe. .. hahaha. .. HAHAHAHAHAHA!!!!!") ;
I
LI STAGEM 7.8 SadObject.java
publiC cl ass SadObject extends MoodyObject {
II redefine o humo r da classe
protected Stri ng getMood() {
return "sad":
I
II especializao
Polimorfi smo: hora de escrever algum cdigo 155
LI STAGEM 7.8 SadObject.java (conti nuao)
publiC vold cry{) (
Sys t em.out.println("'wah' ' boo hoo ' 'weep' ' sob ' ' weep'");
J
J
Sua tarefa prati car o pol imorfismo. Escreva uma classe Psychiatri stObject. Psychia-
t ri s tObj ect deve ter trs mtodos. exami ne () deve pegar qualquer instncia de MoodyObject e
perguntar como ela se sente. Psychi atri stObject tambm deve ter um mtodo observe() sobre-
carregado. observe{) deve chamar os mtodos cry() ou laughO do objelo. A classe Psychia-
lristObjecl deve tecer um comentrio mdico para cada comportament o.
Certi fi que-se de usar a classe PsychiatristDriver fornecida, para testar sua soluo!
A prxima seo discutir as solues do Laboratri o 1. No prossiga at con-
cluir o Laboratrio 1.
Solues e discusso
A Li stagem 7.9 apresenta uma passivei classe PsychiatristObject.
LISTAGEM 7.9 Psychiatr i stObject. java
public class PsychiatristObject {
II usa polimorfismo de incluso para examinar todos os objetos humor
II genericamente
pu bl ic voi d examine(MoodyObject obj ) {
J
Sys tem. out . prlnt ln( "Te11 me, object , how do you feel t oday?" )i
obj . queryMood () ;
System. out.print ln() ;
II usa sobrecarga para observar objetos especificamente.
II mas com um mtodo chamado generi camente
publ ic voi d observe( SadObject obj ) (
J
obj.cry() j
Sys t em. out.print ln(
"Hnm . .. very . ve ry interest i ng. Some thi ng makes thi s object sad." );
System. out . println()j
1 156 Dia7
LI STAGEM 7 .9 Psychi atri stObject.j ava (continuao)
J
publiC void observe{ HappyObject obj ) (
obj . laugh();
J
Sys tem.out.println(
MHmm .. very . very i nteresti ng. This object seems ve ry h a p p y ~ );
System.out .print ln() ;
examine como ( MoodyObjec t obj ) trata todos os obj etos MoodyObject genericamente. O objeto
PsychiatristObject pergunt a ao objeto MoodyObject como ele se sente e chama seu mtodo
queryMood O. O objeto Psychi atri stObject precisa de um mtodo observe O para cada lipo de
objcto MoodyObject que gostaria de observar.
Aps concluir este laboratrio, voc dever comear a se sentir vontade com os mecani smos
bsicos do polimorfi smo.
laboratrio 2: conta de banco aplicando
polimorfismo em um exemplo conhecido
No Laboratrio 2, voc vai pegar o que aprendeu no Laboratri o 1 e aplicar em um problema li
geiramente mais compl icado. Este laboratrio focaliza a hierarquia BankAccount, apresentada no
Dia 5. A hierarquia apresentada aqui conti nua quase igual quela apresentada no Dia 5. A nica
diferena que agora BankAccount uma classe abstrata. Voc no pode mais instanciar um ob-
jeto BankAccount diretament e.
Tornar BankAccount abstrata modela mai s precisamente o funcionamento de contas bancri-
as. Quando voc abre urna conta, abre uma conta de cheque ou urna cont a de mercado finan-
ceiro. Voc no abre uma conta de banco genrica. A Li stagem 7.10 li sta a ni ca mudana na
hierarquia.
llSTAGEM 7 . 10 BankAccount.java
publi c abst ract cl ass Ba nkAccount {
II o restante igual
J
Polimorfismo: hora de escrever algum cdigo 157
Exposio do problema
Neste labormrio, voc precisa escrever uma classe 8ank. A classe Sank tem vri os mtodos.
As instncias de 8ank contm contas. Entretanto, voc precisa de uma maneira de controlar a
quem penencem as contas. addAccount() permite especificar um propri etrio, sempre que voc
adiciona uma nova conta:
publlc YOld addAccount( Str ing name, BankAccount account );
Voc pode usar o nome do propri etrio para acessar a conta correta posteriormente.
totalHol dingsO permite que a classe Bank relate a quantidade total de dinheiro existente no
banco:
publ ic doubl e totalHoldings() ;
totalHoldingsO deve fazer um lao por todas as contas e totalizar o valor mantido no banco.
total Accounts () permite que voc consulte a instncia de Bank para ver quantas contas ela pos-
sui correntemente:
publiC int totalAccounts();
deposi tO permite que voc deposite fundos em uma conta bancria especifica:
public yoid deposite Stri ng name, double amount );
depos i tO um mtodo de convenincia que o li bera de ter de recuperar uma conta especfica,
anlesde poder adicionar rundos ne la. Em vez disso, depos i t () pcnnite que voc deposite fundos
diretamente atravs do banco.
balanceO permite que voc recupere o saldo de uma conta especifica:
public double balance( Stri ng name )
Assim como depos i t 0 , ba 1 ance() um mtodo de convenincia.
addAccountO armazena uma conta sob determinado nome. Existem vrias maneiras
de implementar essa funcionalidade. Entretanto, algumas estratgias so mais fceis
de implementar do que outras.
Para este l aboratrio, voc dever considerar jaya. ut i I . Hashtab I e. Hashtab I e permite
que voc armazene e recupere pares chave/Valor.
Considere esta APl consolidada:
pub1 ic Object get( Object key );
publ ic Object put ( Object key, Object ya1ue );
public lnt size();
publlc Java . util.Enumeration elementos();
Aqui est um exemplo de Hashtable:
Dia 7
java. ut 11 . Hashtab le tab I e new java. util . Hashtab I e();
table.put( -LANGUAGE-, "JAVA" );
String name table.get( -LAHGUAGE" ) ;
Esse exemplo armazena ovalar JAVA sob a chave LANGUAGE. Para recuperara valor pos-
t eri ormente, voc simplesmente chama get() e passa a chave correta.
Estudando a APl, voc notar que os mtodos get () e put () retornam Objecto Assim, se
voc fosse armazenar uma Stri ng, obteria o valor de volta como um Objecto
Na linguagem Java, todos os objetos herdam de Objecto A Hashtable foi escrita
para tratar com Object, de modo que funcionar para todos os objet os Java. Entre-
tanto, e se voc armazenar um objeto CheckingAccount na Hashtable e quiser tra-
t-Ia como um objelo Checki ngAccount, aps recuper-l o? Como voc fari a isso na
linguagem Java?
A linguagem Java fornece um modo de transformar uma referncia de Object de volta
para seu tipo correto. O mecanismo conhecido como converso. A instruo a seguir
invlida na linguagem Java:
CheckingAccount account table.get( "CHECKING ACCOUNT" );
Em vez disso, voc precisar realizar uma converso, antes de poder armazenar uma
referncia de Object em uma varivel CheckingAccount:
CheckingAccount account " (CheckingAccount) table.get( "CHECKlNG ACCOUNT");
Voc precisa tomar cuidado enquanto converte. A converso pode ser perigosa. Por
exemplo, a converso a seguir invlida:
HappyObject o new HappyObject() ;
lable.put( "HAPPY-, o );
(CheckingAccount) table.gel( "HAPPY- );
Quando voc converte, deve certificar-se de que o Objecl que est convert endo seja re-
almente do tipo TYPE . Assim, para este laboratrio, quando voc recuperar um objeto
BankAccount da Hashtable, desejar converter para BankAccount. Como exemplo, consi-
dere a converslio a seguir:
BankAccount b (BankAccount) table.get( "ACCOUNTl" };
Se voc tentar realizar uma converso invlida na linguagem Java, ela lanar uma ex-
ceo ClassCastE)(ception.
Assim como o Laboratri o I, o Laboratrio 2 fornece um driver para ajud-l o a testar sua solu-
o. Certifique-se de consultar BankDriver.
A prxima seo discutir as solues do laboratrio 2. No prossiga at con-
cluir o Laboratrio 2.
Polimorfismo: hora de escrever algum cdigo
Solues e discusso
A Li stagem 7. 11 apresenta lima possvel implementao de Bank.
LI STAGEM 7.11 Bank.java
publlc cl ass Bank (
}
private java.utll .Hashtable accounts = new java.util.Hashtable();
public void addAccount( String name, BankAccount account ) (
accounts .put( name, account ) ;
}
publi C double totaIHoldings() (
double total - 0.0;
}
java.ut il . Enumeration enum = accounts . elements();
while( enum.hasMoreElements() ) (
}
BankAccount account (BankAccount) enum.nextElement();
total +- account .getBalance() ;
return to ta 1 ;
public int totalAccounts() (
return accounts.size();
}
publiC voi d deposite Str ing name , double amount l (
BankAccount account - retrieveAccount( name l;
if( account !a null ) {
account.depositFunds( amount l;
}
}
public double balancei String name ) {
}
BankAccount aCCQunt * retrieveAccount( name );
if( accQunt ! - null ) {
return account.getBalance()i
}
return 0.0;
private BankAccount retrieveAccount( String name ) {
return (BankAccount) accounts. get{ name l i
}
159
Dia 7
I nternamente, essa soluo usa java. ut 11 . Hashtab 1 e para conter todos os objetos BankAccount.
Em vez de forne<::er seu prprio meanismo de annazenamento e recuperao, essa implement a-
o ti ra proveito da reutilizao, utili zando as classes fornecidas pela linguagem Java.
ba 1 ance (), depos i t (), addAccount () e t o ta 1 Ho 1 di ngs (). todos demonstram o pol imorfismo de in-
cl uso. Esses mtodos funcionaro para qualquer subclasse de BankAccount que voc possa criar.
A ps concl uir este laboratri o, voc dever ter uma idia melhor dos mecanismos de pol imorlis-
mo. No Dia 5, os objetos BankAccount mostraram a convenincia da herana. A herana permitiu
que voc cri asse subclasses rapidamente, programando apenas o que era diferente ent re as con-
tas. O polimorfi smo simplifica ainda mais seu cdigo, fornecendo um mecanismo para progra-
mao genrica.
laboratrio 3: conta de banco usando
polimorfismo para escrever cdigo prova
do futuro
Por toda a discusso sobre pol imorfis mo, voc ouvi u o tenno software prova do futuro. O que
exatament e soft ware prova do futuro? Software prova do futuro simplesment e um software
que se adapta faci lmente mudana nos requisitos.
Os requisitos mudam o tempo todo. Quando voc comea a escrever um programa pela pri mei ra
vez, os requisitos podem mudar, enquanto voc aprende mais a respeito do problema que est re-
solvendo. Uma vez escri to, seus usurios esperaro e exigiro novos recursos de seu software.
Se voc criar soft ware prova do fut uro, no ter de reescrev-lo completamente, cada vez que
obt iver um novo requisi to.
Vamos considerar um exemplo de mudana de requisitos. A Listagem 7. 12 apresenta urna nova
classe MoodyObj ect : CarefreeObj ect.
LISTAGEM 7.12 CarefreeObject.java
pub1ic class CarefreeObject extends MoodyObject {
II redefine o humor da classe
}
protected Stri ng getMood() {
ret urn "carefree
M
j
}
II especial izao
pub1ic void whist le{) I
Sys t em. out. print l n{"whi st1e, whist 1e, whistle ... );
}
Polimorfismo: hora de escrever algum cdigo
A Li stagem 7. 13 most ra o Psychiatri stOriver atualizado.
LI STAGEM 7.13 PsychiatristDriver.java
public class PsychiatristOriver I
}
public static void main( Str ing [] args ) I
HappyObject happy new HappyObject():
}
SadObject sad = new SadObject( ) ;
CarefreeObject carefree new CarefreeObject();
PsychlatristObject psychiatrist z new PsychiatristObject();
II usa polimorfi smo de incluso
psychiatrist . examlne( happy ):
psychiatrist.examine( sad ) :
psychiatrist.examine ( carefree ) ;
II usa sobrecarga para que possamos observar os objetos
psychiatrist.observe( happy );
psychiatrist.observe( sad );
A Figura 7.2 mostra a saida que voc vera ao executar PsychiatristOriver.
FIGURA 7.2
A sada correia de
Psychiatri s tOri ver.
161
Dia 7
Aqui , voc v que Psychiatr;stObject prova do ful uro. A qualquer momento, voc pode
adi cionar novos objetos MoodyObject, todos com seu prprio comportamento personalizado.
PsychiatrlstObject pode simplesmente usar os novos subti pos.
Voc pode observar que esse exemplo se concentra no mtodo examineO. O
polimorfi smo de incluso possibilita um software realmente prova do futuro.
Entretanto, se Psychi atri s t Object quiser usar observe () em um novo subtipo,
voc precisar atualizar Psychiatri stObj ect tambm.
MoodyObjec t um exemplo simples. Entretanto, tente imaginar corn o voc poderi a estender essa
idia para programas mais complexos!
Exposio do problema
Sua tarefa testemunhar a programao prova do fut uro em primeira mo. No ltimo laborat-
ri o, voc escreveu uma classe Bank. A classe Bank pode trabalhar com qualquer subtipo de
BankAccount. Sua tarefa criar um novo tipo de BankAccount: a Rewa rdsAcount .
Assim como em Savi ngsAccount , a RewardsAccount aplica j uros no saldo. Entretanto, para aumentar
o nmero e o tamanho dos depsitos, o banco gostaria de introduzi r um sistema de recompensas.
A RewardsAccount cont rola o nmero de depsitos em relao a certa quantidade de dlares: o
nvel de depsito para recompensa. Por exemplo, digamos que o nvel de depsito para recom-
pensa seja de US$SOO dlares. Sempre que o depositante deposita US$SOO ou mais, ele receber
um poruo de recompensa.
NeTA
Mantenha RewardsAccount simples. Se o nvel de depsito para recompensa for
de US$500 e o depositante depositar US$500, ele receber um ponto de re-
compensa. Se o depositante depositar US$3.000, ele ainda dever receber
apenas um ponto de recompensa.
Junto com os mtodos definidos por BankAccount, RewardsAccoun t tambm deve fornecer
um mecanismo para recuperar e recon fi gurar o numero de pontos de recompensa recebidos.
RewardsAccount tambm precisa de um modo para configurar e obter o nvel de depsito
para recompensa.
Para este laboratrio, talvez voc queira vol tar ao Dia 5 e reler as descries dc Sav i ngsAccount e
BankAccount . Este laboratrio tambm inclui u
m RewardsAccountor i ver e um BankOri ver atualizados. Cert ifique- se de us-Ios para testar sua s0-
luo. Voc tambm desejar ver BankOriver. O BankOri ver demonstra como voc pode adicionar
um novo tipo de obj elo em seu programa, sem ter de at uali zar qualquer um dos outros objetos.
Polimorfismo: hora de escrever algum cdigo 163
ALERTA
A prxima seo discutir as solues do laboratrio 3. No prossiga at con-
cluir o laboratri o 3.
Solues e discusso
A Li stagem 7. 14 apresenta uma possvel sol uo para RewardsAccount.
LISTAGEM 7.14 RewardsAccount. java
publi c class Rewa rdsAccount extends SavingsAccount {
private double min_reward_balance:
I
private int quallfying_deposits:
public RewardsAccount( double initDeposit. double interest. double min ) {
super( i nitDeposit. interest ) :
min_reward_balance min:
I
publ ic voi d depositFunds ( doubl e amount ) {
super.deposit Funds( amount ):
I
if( amount >- min_reward_balance )1
qualifying_deposits++:
}
publi c int getRewardsEarnedO I
return qualifying_deposits:
I
publi c voi d resetRewards() {
qual i fying_deposi t s O:
I
publ i c doubl e getMi nimumRewardBal ance O {
ret urn min_reward_balance :
I
publi c voi d setMinimumRewardBalance( double min ) {
min reward bal ance : mi n;
-
I
RewardsAccount sobrepe depos i tFunds O. de modo que pode verificar o saldo e os pont os de re-
compensa. A classe tambm adiciona mtodos para recuperar o saldo das recompensas, reconfi -
gurar o saldo, assi m como obter e configurar o nvel de depsi to para recompensa.
Dia 7
A Listagem 7. 15 apresenta o BankOriver atualizado.
LI STAGEM 7.15 BankOri ver .java
public class 8ankOriver {
I
publlc s t atic void main( String [] args ) {
CheckingAccount ca new CheckingAccount( 5000.00, 5, 2.50 );
OverdraftAccount oa new OverdraftAccount( 10000.00, 0. 18 ):
SavingsAccount sa new SavingsAccount( 500.00. 0. 02 ):
TimedMaturityAccount tma K new TimedMaturityAccount(
10000 . 00, 0.06. 0.05 ):
Bank ba nk new Bank( )j
bank.addAccount( "CHECKING", ca ):
bank.addAccount( "OVERORAFT", oa );
bank.addAccount( "SAVINGS" , sa };
bank. addAccount ( "TMA" , tma );
Sys tem.out.println( "Total holdings(shou ld be $25500.0): $" +
bank.totalHoldings() )i
System.out.println( "Total accounts(should be 4): " +
Bank.totalAccountsO ) ;
RewardsAccount ra new RewardsAccount( 5000. 00, .05, 500.00 };
bank.addAccount( "REWAROS", ra };
System.out.print ln( "Total holdings(should be $30500 . 0): $" +
bank.totalHoldings() ) ;
System. out.println( "Total accounts(should be 5): " +
bank. to ta l Accounts () };
bank.depos1t( "CHECKING", 250 . 00 };
double new_balance bank . balance( "CHECKING " };
Sys t em. out.pr intln( "CHECKING new balance (should be 5250. 0): $" +
new balance ):
I
Para usar a nova classe de conta existem dois passos que voc deve dar.
Para o primeiro passo, voc deve criar seu novo subti po. Aps criar seu novo subti po, voc pre-
cisa aherar seu programa para criar novas instncias do objeto.
No caso de RewardsAccoun t , voc deve atual izar o mtodo mai n () de BankAccount, para cri ar ins-
tncias de RewardsAccount. Ent retamo, voc no precisa mudar mais nada!
Polimorfismo: hora de escrever algum cdigo 165
Quando voc est iver escrevendo um programa real, percorrer os mesmos passos para introduzir
novos subtipos em seu programa. Primeiro, voc precisar cri ar o novo subtipo.
Segundo, voc preci sar al terar seu cdigo para que ele possa criar seu novo subtipo. Mas, isso.
Voc no preci sa alterar o restante de seu programa.
Posterionnente, voc ver maneiras de tomar seus programas to flexvei s, que poder nem preci-
sar alterar qualquer cdigo de seu programa para que ele encontre e comece a usar novos subtipos.
laboratrio 4: estudo de caso estruturas
condicionais Java e polimorfismo
A linguagem Java, assi m como muitas outras, fornece um mecanismo de troca. Considere o m-
todo day of the week() a seguir:
- - -
public void day_of_the_week(int day ) {
switch ( day ) (
I
I
case 1:
System.out.pr intln ( "Sunday );
break;
case 2:
System.out.println( "Monday ) ;
break;
case 3:
System.out.println ( "Tuesday l;
break;
case 4:
System.out.println( "Wednesday" );
break;
case 5:
System.out.println( "Thursday" );
break;
case 6:
Sys t em.out.println( "Friday" l;
break;
case 7:
System.out.print ln{ "Saturday" )i
break;
default:
System.out.pr i ntln{ day + " is not a valid day. );
break;
Dia 7
o mtodo recebe um parmetro: um valor inteiro representando o dia da semana. Ent o, o mto-
do testa todos os dias vlidos da semana. Se o argumento day corresponder a um dos dias, o m-
todo imprimir o nome do dia.
Geralmente fa lando, voc usa estnlluras condicionais (case ou i r te 1 se) para realizar lgica con-
dicionaI. Com a lgica condicional, voc procura certa condio nos dados. Se essa condio for
satisfeita, voc faz algo. Se outra condio for satisfeita, voc faz algo inteiramente diferente. To-
dos osque tm base procedural devem estar familiarizados com tal estratgia de programao.
Se voc se sente vontade com estruturas condicionais, hora de desaprender um pouco. A lgi-
ca condicional geralmente considerada uma m prtica de 00. Na verdade ela to m, que
muitas linguagens 00 no fornecem tais estruturas. A lgica condicional tem uma vantagem;
ela o ajuda a detectar um projeto mal feito!
As estruturas cond icionais so quase sempre ms por natureza. Entretant o, elas frcqcnte-
mente se insinuam sua frente, pois aparecem em muitas formas. Considere um mtodo
day_of_t he_weekO li gei ramente diferente.
public void day_of_the_week( int day )
I
iflday"')!
System.out.println( "Sunday" );
} el se ir ( day == 2 ) I
System.out.println{ "Monday" };
} else if ( day 3 ) {
Sys tem.out.print ln( "Tuesday };
} else if ( day 4 ) I
System.out.println{ "Wednesday" );
} else ir ( day 5 ) I
System.out.print ln( "Thursday );
} else if ( day 6 ) I
System.out. println( "Fri day" };
} else ir ( day =- 7 ) I
System. out.print ln ( "Saturday" ) ;
} else {
System.out.printl n( day + " is not a valid day." };
I
Ento, o que h de errado com as estruturas condicionais?
As estrulUras condicionais so contrrias aos concei tos de 00. Na 00, voc no soli cita os da-
dos de um objeto e depois faz algo com esses dados. Em vez disso, voc sol icita para que um ob-
jeto faa algo com seus dados. No caso do metodo day_of_the_weekO, voc provavelmente
obtem day de algum objeto. Voc no deve estar processando dados brutos. Em vez disso, voc
deve solicitar ao obj eto uma representao de string. As estruturas condicionais o obrigam a mistu-
rar responsabilidades. Cada lugar que usa os dados ter de aplicar a mesma lgica condicional.
Polimorfi smo: hora de escrever algum cdi go 167
Existem ocasies em que as condicionais so absolutamente necessri as. Ent o, como voc de-
tecla ' ms' estrut uras condicionais?
Existem meios de saber quando uma estrutura condicional ' boa' fi ca 'ruim'. Se voc se encon-
trar atual izando uma estrut ura case ou blocos 1 fi el se, sempre que adicionar um novo subtipo,
as chances so de que a estrutura condicional ' ruim'. No apenas isso uma m prtica de 00,
como tambm um pesadelo de manuteno. Voc ter que certificar-se deatualizar cada condi -
cionai que teste os dados. Exigir mui to tempo para garantir que voc no se esqueceu de atuali-
zar algo!
Corrigindo uma estrutura condicional
Considere O mtodo a seguir:
publi c i nt ca l cul ate( Stri ng operao. int operand l. int operand2 ) {
if ( operation.equals( "+" ) ) (
J
return operandl + operand 2;
) el se if ( operat1on. equals ( "*" ) ) {
return operandl *operand2;
} el se i f ( operat i on.equals( ~ M ) ) {
return operandl loperand2;
J el se if ( operatlon. equals( "." ) ) I
return operand l - operand2;
) else (
J
Sys t em.out.print ln( "invalid oper at ion: + operat ion ) ;
return O;
Tal mtodo poderia aparecer em um problema de calculadora. O mtodo calcul ateO recebe a
operao, assim como os dois operandos, como argumentos. Ento, ele efetua o clcul o sol icitado.
Sendo assim, como voc poderia corri gir o problema? Voc pode corrigi-lo com objetos, claro!
Quando voc comear a eliminar lgica condicional , comece com os dados que est testando.
Transforme os dados em um objeto.
Neste caso, voc deve criar objetos adio, subtrao, mult'i plicao e di vi so. Todos esses obje-
tos so operaes. Assim, todos eles devem herdar de uma classe base comum. Conforme voc
j viu por todo este dia, a capacidade de substi tuio e o pol imorfi smo permitiro que voc faa
algumas coisas inteligentes com esses objetos.
Todos os objetos que voc deve criar so operaes; portanto, voc sabe que precisa de uma classe
base Operati on. Mas o que uma classe Operation faz? Uma classe Ope rat ion calcula algum valor,
dados dois operandos. A Listagem 7. 16 apresenta uma classe Operation.
1 168 Dia7
LI STAGEM 7.16 Operation.java
publ i c abstract class Operation (
pllblic abstract int cal clll ate ( int operand l. i nt operand2 ):
,
As listagens 7.17, 7. 18, 7.19 e 7.20 apresentam os vri os objetos operao.
LI STAGEM 7.17 Add.java
plIbl i c class Add extends Operati on {
,
publi c int cal clllat e( int operandl . int operand2 ) I
retllrn operandl + operand2:
,
LI STAGEM 7.18 Subt ract.java
publi C cl ass SlI btrac t extends Operation I
,
publ ic i nt calcul ate ( int operandI. i nt operand2 ) I
return operandl - operand2 :
,
LISTAGEM 7.19 Mult i ply. j ava
public class Mu l t lply extends Operati on (
,
public int calculat e( int operandl. int operand2 ) {
return operandl * operand2;
,
LISTAGEM 7.20 Oivide . java
publ ic cl ass Divide extends Operation (
,
publ ic int calcul ate ( i nt operand I. int operand2 ) {
return operandl I oper and2;
,
Cada operao implementa o mtodo ca 1 cul ateO de sua prpria maneira. Agora que voc tem
um objelo para cada operao, pode reescrever o mtodo cal culate() original.
Polimorfismo: hora de escrever algum cdigo
public int cal culate( Operation operation, int operandI, int operand2 ) (
return operat i on.ca l culate( operandl , operand2 );
I
169
Transfonnando a operao em um objeto. voc ganhou muita flexi bilidade. No passado, voc
leria de at ualizaro mtodo sempre que quisesse adicionar uma nova operao. Agora, voc pode
simplesmente criar a nova operao e pass- Ia para o mtodo. Voc no precisa alterar o mtodo
de maneira alguma, para que ele funcione com a nova operao-ele simplesmente func iona.
Exposio do problema
A linguagem Java fornece um operador chamado instanceof. O operador instanceof permite
que voc verifique o tipo subjacente de lima referncia.
String s "somestring"
Object obj = S;
System.out.println( (obj ins tanceof String) ),
Esse segmento de cdigo imprime true. obj contem uma instncia de String. A maioria das lin-
guagens de roo fornece um mecanismo semelhante.
Agora, considere a nova classe Payro 11, na Listagem 7.21.
LI STAGEM 7.21 Payroll.java
public class Payrol1 (
pr; vate i nt
pri vate ; nt
private double
total _hours,
total_sales;
total_pay;
public void payEmployees( Employee [J emps ) (
I
for ( int i - O, i < emps.length; ; ++ ) (
Emp l oyee emp z emps[i];
I
total_pay +- emp.calculatePay();
emp.printPaycheck();
publiC void calculate80nus( Employee
for( int i .. O; i < emps.length,
Employee emp emps[i] ;
[] emps I I
) I
i++
if( emp instanceof HourlyEmpl oyee ) (
System.out. print ln(" Pay bonus to .. + emp. getlastNameO +
", " + emp.getFirstNameO + " SIOO.OO." );
I else if ( emp instanceof CommissionedEmpl oyee ) {
i nt bonus - ( (Commi ssionedEmployee) emp ).getSales() 100;
1 170 Dia7
LI STAGEM 7.21 Payroll.java (continuao)
}
}
}
bonus to + emp. getLastName() +
emp.get FirstNameO + $" + bonus ):
I else (
System,ouLprintln( "unknown employee type
M
):
}
public vo1d recordEmployeelnfo( CommissionedEmpl oyee emp ) (
total _s ales +- emp.getSales() :
}
publi C vo1d recordEmployeelnfo( HourlyEmployee emp ) (
total_hours +- emp.getHour s() :
}
publ ic void pr1ntReport() (
System.out.println( "Payroll Report:" ) :
}
System.out.pri ntln( -Total Hours: " + tota l_hours ):
System. out.println( MTotal Sales: " + total _sales );
System.out.print ln( MTotal Paid: $" + total_pay ):
" +
Essa classe Payroll tem um mtodo ca l cul ateBonus (). Esse mtodo recebe um array de objetos
Empl oyee, descobre qual o tipo de cada um e calcula um bnus. Os objetos HourlyEmp loyee re-
cebem um bnus fixo de US$ IOO, enquanto os objetos COIl'Illi ss i onedEmpl oyee recebem USS IOO
por cada venda.
Sua tarefa eliminar a lgica cond icional encontrada em cal culateBonus(). Comece atacando
os dados que o mtodo est testando. Neste caso, ele est testando em um objeto. Ento, o que
est errado?
Em vez de soli citar o bnus ao objeto, o mtodo soli cita a ele alguns dados e, em seguida, calcula
um bnus, usando esses dados. Em vez disso, o mtodo deve solicitar os dados ao objeto.
Voc pode fazer downl oad do cdigo-fonte das classes Payroll, Empl oyee, HourlyEmployee e
Commiss i onedEmp l oyee. Tambm existe um Payroll Dri ver fomecido, para que voc possa testar
facilmente sua soluo.
A prxima seo di scutir as solues do Laboratrio 4. No prossiga at con-
cluir o Laborat ri o 4.
Polimorfismo: hora de escrever algum cdigo 171
Solues e discusso
Para resolver esse problema, voc deve adicionar um mtodo cal culateBonus () diretamente em
cada objeto Employee. Isso poderia parecer como se voc estivesse cai ndo na armadilha I do Dia
6. Entretanto, est correto mover o mtodo para a classe base, pois todas as subclasses sabem
como calcular seu bnus. Na verdade, isso j deveria estar na classe h muito tempo.
As listagens 7.22, 7.23 e 7.24 apresentam as alteraes exigidas.
LISTAGEM 7.22 Employee.java
publiC abstract class Employee (
publi c abstract double calculateBonus() ;
II reduz ido por brevi dade. o restante diz o mesmo
J
LI STAGEM 7.23 Hour l yEmployee .java
publi c class HourlyEmployee extends Employee {
publ ic double calcul ateBonus() {
return 100 . 00 ;
J
II reduzido por brevidade. o restante diz o mesmo
J
LISTAGEM 7.24 CornnissionedEmployee.java
public class CommissionedEmployee extends Employee {
publi c double calculateBonus() {
return 100.00 * getSales() ;
J
II r eduzido por brevidade . o restante diz o mesmo
J
Com essas alteraes, voc pode at uali zar a classe Payroll, como a Listagem 7.25 demonstra.
LI STAGEM 7.25 Payroll.java
publi c class Payroll {
public void calculat eBonus( Empl oyee [) emps ) {
for( int i z O; i < emps.length; i ++ ) (
Employee emp emps [i] ;
System. out.println("Pay bonus to " + emp.getlastName() + M, " +
emp. getFirstName() + " S" + emp.cal culat eBonus()
1 172 Dia7
LISTAGEM 7.25 Payroll.java (cont inuao)
) ;
)
)
II reduzido por brevi dade . o rest ante diz o mesmo
)
Vamos! Acabou-se a lgica condicional irritant e!
DICA
DICA
Resumo
Dicas sobre estruturas condicionais:
Evite o use de estrut uras condicionais case ou j f/else.
- Considere os blocos if/else grandes com celi ci smo.
- Cuidado com alteraes em cascata. Se uma alterao exige mui tas mu-
danas condicionais, tal vez voc tenha um problema.
lnstanceof um si nal de perigo muito grande.
H/ehe, case e instanceof so Nculpados at prova em contrrio
N