Top Banner
.
202

uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Aug 06, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

.

Page 2: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2
Page 3: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

EstaapostiladaCaelumvisaensinardeumamaneiraelegante,mostrandoapenasoqueénecessárioequandoénecessário,nomomentocerto,poupandoo leitordeassuntosquenãocostumamserdeseuinteresseemdeterminadasfasesdoaprendizado.

ACaelumesperaquevocêaproveiteessematerial.Todososcomentários,críticasesugestõesserãomuitobem-vindos.

Essa apostila é constantemente atualizada edisponibilizadano sitedaCaelum.Sempre consulteositeparanovasversõese,aoinvésdeanexaroPDFparaenviaraumamigo,indiqueositeparaqueelepossasemprebaixarasúltimasversões.Vocêpodeconferirocódigodeversãodaapostilalogono naldoíndice.

Baixesempreaversãomaisnovaem:www.caelum.com.br/apostilas

Esse material é parte integrante do treinamento C# e Orientação a Objetos e distribuídogratuitamente exclusivamente pelo site da Caelum. Todos os direitos são reservados à Caelum. Adistribuição, cópia, revenda eutilizaçãoparaministrar treinamentos são absolutamente vedadas.Parausocomercialdestematerial,porfavor,consulteaCaelumpreviamente.

SOBREESTAAPOSTILA

Page 4: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

2

4

15

21

26

Sumário

1ComoaprenderC#1.1Oqueérealmenteimportante? 21.2Sobreosexercícios 21.3Tirandodúvidaseindoalém 3

2OqueéC#e.Net2.1UmpoucosobreahistóriadoC#e.Net 42.2Máquinavirtual 52.3ExecuçãodocódigonaCLReoJIT 62.4OambientededesenvolvimentodoC# 72.5ExecutandoaplicaçõessemoVisualStudio 72.6OprimeiroprogramaemC# 82.7Exercícios 122.8Oqueaconteceuduranteaexecução? 13

3Variáveisetiposprimitivos3.1Operaçõescomvariáveis 153.2TiposPrimitivos 173.3Armazenandotextoemvariáveis 183.4Documentandoocódigoatravésdecomentários 183.5Exercícios 19

4Estruturasdecontrole4.1Tomandodecisõesnocódigo 214.2Maissobrecondições 224.3Exercíciosopcionais 23

5Estruturasderepetição5.1Repetindoumblocodecódigo 265.2Parasabermaisdowhile 275.3Parasabermaisincrementoedecremento 27

SumárioCaelum

Page 5: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

30

48

58

63

81

5.4Exercícios 28

6Classeseobjetos6.1OrganizandoocódigocomObjetos 306.2Extraindocomportamentosatravésdemétodos 336.3Devolvendovaloresdedentrodométodo 356.4Valorpadrãodosatributosdaclasse 376.5Maisumexemplo:Transfere 386.6Convençãodenomes 396.7Exercícios 466.8Composiçãodeclasses 456.9Exercícios 46

7EncapsulamentoeModificadoresdeAcesso7.1Encapsulamento 497.2Controlandooacessocomproperties 517.3SimplificandoadeclaraçãodepropriedadescomAuto-ImplementedProperties 537.4Convençãodenomeparaproperty 547.5Exercícios 557.6Parasabermais:VisibilidadeInternal 56

8Construtores8.1Múltiplosconstrutoresdentrodaclasse 588.2Parasabermais—Initializer 608.3Exercícios 60

9IntroduçãoaoVisualStudiocomWindowsForm9.1IntroduçãopráticaaosatalhosdoVisualStudio 669.2AclasseConvert 709.3Operaçõesnaconta:saqueedepósito 709.4Controlandoonomedaaçãodeumbotão 739.5RenomeandoVariáveis,MétodoseClassescomoVisualStudio 749.6Parasabermais—organizandooformuláriocomLabeleGroupBox 759.7ResumodosatalhosdoVisualStudio 769.8Exercícios 779.9Parasabermais—tiposimplícitoseapalavraVAR 779.10ExercíciosOpcionais 79

10Herança10.1ReaproveitandocódigocomaHerança 8210.2Reaproveitandoaimplementaçãodaclassebase 84

CaelumSumário

Page 6: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

92

101

110

113

120

125

134

141

149

10.3Polimorfismo 8510.4Exercícios 8710.5Parasabermais—oqueéherdado? 90

11Trabalhandocomarrays11.1Parasabermais—inicializaçãodeArrays 9311.2Exercícios 9911.3OrganizandoascontascomoComboBox 9711.4Exercícios 99

12Cadastrodenovascontas12.1UtilizandooAdicionaContanoloaddoformulário 10512.2Exercícios 107

13Classesabstratas13.1Exercícios 112

14Interfaces14.1Exercícios 116

15Métodoseatributosestáticos15.1ExercíciosOpcionais 12215.2Parasabermaisclassesestáticas 123

16Exceções16.1Retornodométodoparacontrolarerros 12516.2Controlandoerroscomexceções 12616.3Tratandomúltiplasexceções 12816.4Exercícios 131

17Namespaces17.1Parasabermais-Declaraçãodenamespaceaninhados 13617.2Parasabermais-Aliasparanamespaces 13717.3Exercícios 138

18ClasseObject18.1Implementandoacomparaçãodeobjetos 14118.2MelhorandoaimplementaçãodoEqualscomois 14418.3IntegrandooObjectcomoComboBox 14518.4Exercícios 146

19Trabalhandocomlistas

SumárioCaelum

Page 7: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

153

166

176

185

190

19.1Facilitandootrabalhocomcoleçõesatravésdaslistas 14919.2Exercícios 151

20Lidandocomconjuntos20.1Otimizandoabuscaatravésdeconjuntos 15320.2ConjuntosOrdenadoscomoSortedSet 15520.3Ainterfacedetodososconjuntos 15620.4Comparaçãoentrelistaseconjuntos 15620.5Exercícios 16320.6BuscasrápidasutilizandoDicionários 16020.7Iterandonodicionário 16120.8Exercícios 163

21LINQeLambda21.1FiltrosutilizandooLINQ 16621.2Simplificandoadeclaraçãodolambda 16721.3OutrosmétodosdoLINQ 16821.4UtilizandooLINQcomoutrostipos 16921.5Melhorandoasbuscasutilizandoasintaxedequeries 16921.6Parasabermais—projeçõeseobjetosanônimos 17021.7Exercícios 17021.8OrdenandocoleçõescomLINQ 17421.9Exercícios-Ordenação 175

22System.IO22.1Leituradearquivos 17622.2Escrevendoemarquivos 17822.3Gerenciandoosarquivoscomousing 17922.4Exercícios 18022.5Parasabermais—ondecolocarosarquivosdaaplicação 183

23Manipulaçãodestrings23.1Exercícios 186

24Apêndice—estendendocomportamentosatravésdemétodosextras24.1Exercícios 191

Versão:22.8.23

CaelumSumário

Page 8: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

.

Page 9: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO1

Muitoslivros,aopassardoscapítulos,mencionamtodososdetalhesdalinguagem,juntamentecomseusprincípios básicos. Isso acaba criandomuita confusão, em especial porque o estudante não conseguediferenciarexatamenteoqueéessencialaprendernoinício,daquiloquepodeserdeixadoparaestudarmaistarde.

Se uma classe abstrata deve ou não ter aomenos ummétodo abstrato, se oif somente aceitaargumentosbooleanosetodososdetalhessobreclassesinternas,realmentenãodevemserpreocupaçõesparaaquelecujoobjetivoprimárioéaprenderC#.Essetipodeinformaçãoseráadquiridacomotempoenãoénecessárianoinício.

Nestecurso, separamosessas informaçõesemquadrosespeciais, jáque são informaçõesextra.Ouentão,apenascitamosemalgumexercícioedeixamosparaoleitorprocurarinformaçõesadicionais,sefordeseuinteresse.

Porfim,faltamencionaralgosobreaprática,quedevesertratadaseriamente:todososexercíciossãomuito importantes e os desafios podem ser feitos após o término do curso. De qualquer maneira,recomendamosaosalunosestudarememcasaepraticarembastantecódigoevariações.

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

COMOAPRENDERC#

1.1OQUEÉREALMENTEIMPORTANTE?

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

1.2SOBREOSEXERCÍCIOS

.

Page 10: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Os exercícios do curso variam, de práticos até pesquisas na internet, ou mesmo consultas sobreassuntosavançadosemdeterminadostópicos,paraincitaracuriosidadedoaprendiznatecnologia.

Existe também, em determinados capítulos, uma série de desafios. Eles focammais no problemacomputacionalquenalinguagem,porémsãoumaexcelenteformadetreinarasintaxee,principalmente,familiarizaroalunocomasbibliotecaspadrãodoC#,alémdeproporcionarumganhonavelocidadededesenvolvimento.

Paratirardúvidasdeexercícios,oudeC#emgeral,recomendamosofórumdoGUJRespostas:

http://www.guj.com.br

Lásuadúvidaserárespondidaprontamente.OGUJfoifundadopordesenvolvedoresdaCaelumehojecontacommaisdeummilhãodemensagens.

Oprincipalrecursooficialparaencontrardocumentação,tutoriaiseatémesmolivrossobre.NETeC#,éaMicrosoftDevelopersNetwork,ouMSDN:

https://msdn.microsoft.com

DestacamosaseçãodetutoriaisdeC#(eminglês),noendereço:

https://www.microsoft.com/net/tutorials/csharp/getting-started

HátambémfórunsoficiaisemportuguêsnaMSDN:

https://social.msdn.microsoft.com/Forums/pt-br/home

Foraisso,sinta-seàvontadeparaentraremcontatocomseuinstrutorparatirartodasasdúvidasquesurgiremduranteocurso.

Seoquevocêestábuscandosãolivrosdeapoio,sugerimosconheceraeditoraCasadoCódigo:

https://www.casadocodigo.com.br/

ACaelumofereceoutrocursodeC#/.NET,oFN-23,quetrazaaplicaçãodoC#naWeb:

https://www.caelum.com.br/

Hátambémcursosonlinequevãoajudá-loairalém,commuitainteraçãocomosinstrutores:

https://www.alura.com.br/

1.3TIRANDODÚVIDASEINDOALÉM

.

Page 11: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO2

EntenderumpoucodahistóriadoC#edo.Netéessencialparaenxergarosmotivosquealevaramaosucesso.

Nofinaldadécadade1990aMicrosofttinhadiversastecnologiaselinguagensdeprogramaçãopararesolvermuitosproblemasdiferentes.Todavezqueumprogramadorprecisavamigrarparaumanovalinguagem, era necessário aprender tanto a nova linguagemquanto suas bibliotecas e conceitos. Parasolucionaressesproblemas,aMicrosoftrecorreuàlinguagemJava.

OJavaagradouosengenheirosdaMicrosoftpoiscomelapodíamosconstruirprogramasqueeramindependentesdoambientedeexecução,alémdepossuirdiversasbibliotecascomsoluçõesprontasparadiversos problemas. Para lançar produtos baseados no Java, a Microsoft assinou um acordo delicenciamentocomaSunparautilizaroJavaemambienteWindows.

Porém,alinguagemJavapossuíaumgraveproblema:elanãosecomunicavabemcomasbibliotecasdecódigonativo(códigodemáquina)quejáexistiam.Pararesolverisso,aMicrosoftdecidiucriarasuaprópria implementação do Java chamado J++, que possuía extensões proprietárias que resolviam oproblema de comunicação com o código nativo existente. Para o desenvolvimento dessa novaimplementação do Java, a Microsoft contratou um engenheiro chamado Anders Hejlsberg, um dosprincipaisnomesportrásdoDelphi.

O J++ eraumaversãoda linguagem Javaque sópodia ser executadano ambienteMicrosoft. Seucódigonãopodia ser executado emmaisnenhumambiente Java, o que violavao licenciamento feitocomaSune,porisso,aMicrosoftfoiprocessada.Umadasmaisconhecidasbatalhasjudiciaisdaépoca.

Semo J++, aMicrosoft foi obrigada a repensar sua estratégia sobre como lidar comasdiferenteslinguagens e tecnologias utilizadas internamente. A empresa começou a trabalhar em um novaplataforma que seria a base de todas as suas soluções, que posteriormente foi chamada de .Net. Essenovo ambiente de desenvolvimento da Microsoft foi desde o início projetado para trabalhar comdiversas linguagens de programação, assim diversas linguagens diferentes compartilhariam omesmoconjunto de bibliotecas. Com isso, para um programador migrar de uma linguagem para outra eleprecisariaapenasaprenderalinguagemsemsepreocuparcomasbibliotecaseAPIs.

Alémde umaplataforma aMicrosoft tambémprecisava de uma linguagemde programação.Um

OQUEÉC#E.NET

2.1UMPOUCOSOBREAHISTÓRIADOC#E.NET

.

Page 12: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

novo projeto de linguagem de programação foi iniciado, o projeto COOL (C-like Object OrientedLanguage).AndersHejlsbergfoiescolhidocomoengenheirochefedessenovoprojeto.COOLteveseudesignbaseadoemdiversasoutraslinguagensdomercadocomoJava,C,C++,Smalltalk,DelphieVB.Aideiaeraestudarosproblemasexistenteseincorporarsoluções.

Em 2002, o projeto COOL foi lançado como linguagemC# 1.0, junto com o ambiente .Net 1.0.Atualmente, a linguagem C# está em sua versão 7.0, e o .Net na versão 4.7, tendo evoluído comexpressivavelocidade,adotandonovidadesnasuasintaxequeadiferenciarambastantedoJavaeoutrasconcorrentes.

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

Em uma linguagem de programação como C e Pascal, temos a seguinte situação quando vamoscompilarumprograma:

O código fonte é compilado para código de máquina específico de uma plataforma e sistemaoperacional.Muitasvezesoprópriocódigofonteédesenvolvidovisandoumaúnicaplataforma!

Esse código executável (binário) resultante será executado pelo sistema operacional e, por essemotivo, ele deve saber conversar com o sistema operacional em questão. Isto é, temos um códigoexecutáveldiferenteparacadasistemaoperacionaldiferente.

Precisamosreescreverummesmopedaçodaaplicaçãoparadiferentessistemasoperacionais,jáqueelesnãosãocompatíveis.

OC#utilizaoconceitodemáquinavirtual.Entreo sistemaoperacional e a aplicação existeumacamadaextraresponsávelpor"traduzir"—masnãoapenasisso—oquesuaaplicaçãodesejafazerparaasrespectivaschamadasdosistemaoperacionalondeelaestárodandonomomento.

Seuslivrosdetecnologiaparecemdoséculopassado?

2.2MÁQUINAVIRTUAL

.

Page 13: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Reparequeumamáquinavirtualéumconceitobemmaisamploqueodeuminterpretador.Comoopróprio nome diz, uma máquina virtual é como um "computador de mentira": tem tudo que umcomputador tem. Em outras palavras, ela é responsável por gerenciar memória, threads, a pilha deexecuçãoetc.

Sua aplicação roda sem nenhum envolvimento com o sistema operacional! Sempre conversandoapenas com amáquina virtual doC#, aCommonLanguageRuntime (CLR).ACLR é o ambiente deexecuçãopara todasas linguagensdaplataforma .Net,nãoapenasparaoC#.Certamente issonão foiuma revolução. O Java trouxe esse conceito para omercado e já haviamuitas linguagens com essesrecursos,apesardequeeramencontradasmaisnomeioacadêmico.

O CLR isola totalmente a aplicação do sistema operacional. Se uma aplicação rodando no CLRtermina abruptamente, elanão afetará as outrasmáquinas virtuais enemo sistemaoperacional. Essacamada de isolamento também é interessante quando pensamos em um servidor que não pode sesujeitararodarcódigoquepossainterferirnaboaexecuçãodeoutrasaplicações.

Comoamáquinavirtualdevetrabalharcomdiversaslinguagensdeprogramaçãodiferentes,aCLRnão pode executar diretamente o código do C#, ela precisa executar uma linguagem intermediáriacomumatodasaslinguagensdaplataforma.Net,aCIL(CommonIntermediateLanguage).ParageraroCIL que será executado pelaCLR, precisamos passar o códigoC#por um compilador da linguagem,comooprogramacsc.exe.Ocompilador lêoarquivocomocódigo fontedoprogramaeo traduzparaocódigointermediárioqueseráexecutadopelamáquinavirtual.

COMMONLANGUAGEINFRASTRUCTURE

Ainfraestruturanecessáriaparaexecutaroscódigosescritosparaaplataforma.NetéchamadadeCLI (Common Language Infrastructure). A CLI engloba a máquina virtual do C# (CLR), alinguagemintermediária(CIL)eostiposbaseutilizadosnosprogramas.

Para executarmosumaaplicaçãoC#,precisamospassaro códigoCILdoprogramapara aCLR, amáquina virtual do .Net. A CLR por sua vez precisa executar o código da aplicação no sistemaoperacionaldousuárioe,paraisso,precisaemitirocódigodemáquinacorretoparaoambienteemqueoprogramaestásendoexecutado.MasaCLRnãointerpretaoCILdoprograma,issoseriamuitolento,ao invés disso, quando o programaC# é carregado namemória, aCLR converte automaticamente ocódigoCILparacódigodemáquina,esseprocessoéfeitoporumcompiladorJustinTime(JIT)daCLR.

Esse carregamentoutilizandoo JIT faz comqueo códigoescritona linguagemC#execute comodesempenhomáximo,omesmodeumprogramaescritoemlinguagensquecompilamdiretamentepara

2.3EXECUÇÃODOCÓDIGONACLREOJIT

.

Page 14: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

ocódigodemáquina,mascomavantagemdeexecutarnoambienteintegradodo.Net.

NessecursoescreveremostodoocódigoutilizandooVisualStudioComunity,aversãogratuitadaferramenta de desenvolvimento de aplicações, que é distribuída pela própria Microsoft. Apesar dasexplicações serem feitas com base na versão comunity, tudo funcionará damesma forma dentro dasversõespagasdaferramenta.

OVisualStudioComunitypodeserencontradonosite:

https://www.visualstudio.com/pt-br/downloads/

AversãoqueutilizaremosnaapostilaéaVisualStudioComunity2017.

Durantea instalaçãodoVisualStudio,o .NetFrameworktambémseráautomaticamenteinstaladoemsuamáquina,entãoelaestaráprontaexecutarasaplicaçõesescritasemC#.

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

Comovimosanteriormente,paraexecutarmosumaaplicaçãoC#precisamosdamáquinavirtualdalinguagemalémdasbibliotecasdo.NetFramework.AoinstalarmosoVisualStudio,todoesseambientede execução de programas é automaticamente instalado em nossas máquinas, mas e se quisermosexecutaroprogramaemumcomputadorquenãotenhaoVisualStudioinstalado,ocomputadordeumcliente,porexemplo?

Nessecasoprecisamosinstalarapenasoambientedeexecuçãonocomputadordocliente.ParaissopodemosutilizarumpacotedeinstalaçãofornecidopelaprópriaMicrosoft,essessãoos.NetFrameworkRedistributable.Opacotedeinstalaçãoparaaúltimaversãodo.NetFramework(4.5.1lançadaem2013)podeserencontradanoseguintesite:

2.4OAMBIENTEDEDESENVOLVIMENTODOC#

Agoraéamelhorhoradeaprenderalgonovo

2.5EXECUTANDOAPLICAÇÕESSEMOVISUALSTUDIO

.

Page 15: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

http://www.microsoft.com/en-us/download/details.aspx?id=40779

C#EMOUTROSAMBIENTES

Podemos também executar o código C# dentro de ambientes não windows utilizandoimplementaçõeslivresdoCommonLanguageInfrastructure.UmaimplementaçãodoambientedeexecuçãoparaambientesnãoWindowséoMono:

http://www.mono-project.com/Main_Page

Agora que já entendemos o funcionamento da linguagem C#, vamos começar a desenvolver aprimeiraaplicaçãoutilizandooVisualStudio.ParacriarmosumprogramaC#utilizandooVisualStudioprecisamosinicialmentedeumnovoprojeto.

DentrodoVisualStudio2017,aperteoatalhoCtrl+Shift+Nparaabriroassistentedecriaçãodenovoprojeto.

Nocantoesquerdodajaneladoassistentedecriaçãodenovoprojeto,podemosescolheralinguagemde programação que desejamos utilizar, escolha a opçãoVisualC#. Como tipo de projeto escolha a

2.6OPRIMEIROPROGRAMAEMC#

.

Page 16: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

opçãoWindows FormApplication, com isso estamos criando um novo projeto de interface gráficautilizandooC#.

No canto inferior da janela, podemos escolher o nome do projeto alémda pasta em que ele seráarmazenado.UtilizaremosOiMundocomonomedessenovoprojeto.

Queremos inicialmentecolocarumbotãono formulárioque,quandoclicado,abriráumacaixademensagemdoWindows.

Paracolocarmosobotãonoformulário,precisamosabrirumanovajaneladoVisualStudiochamadaToolbox, que fica no canto esquerdo da janela do formulário. O Toolbox também pode ser abertoutilizando-seoatalhoCtrl+Alt+X.Dentrodajanelado"Toolbox",nogrupo"CommonControls",cliquenocomponente"Button"earraste-oparaoformulário.

.

Page 17: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Agora dê um duplo clique no botão que acabamos de adicionar para programarmos o que deveacontecerquandoobotãoforclicado.OVisualStudioabriráocódigodoformulário.Nãosepreocupecomtodoocódigocomplicadoqueestáescritonessearquivo,entenderemososignificadodecadaumadessaslinhasmaisafrentenocurso.

.

Page 18: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;

namespaceform{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}

privatevoidbutton1_Click(objectsender,EventArgse){

}}}

Otrechodecódigoquenosinteressanomomentoé:

privatevoidbutton1_Click(objectsender,EventArgse){

}

Todocódigoqueforcolocadodentrodaschavesseráexecutadoquandoobotãoforclicado.

No clique do botão, queremos executar o comando quemostra uma caixa demensagens para ousuário.

MessageBox.Show(mensagem)

NoC#,todocomandodeveserterminadopelocaractere";".Portanto,ocódigoparamostraracaixademensagemficadaseguinteforma:

MessageBox.Show(mensagem);

Queremos que, ao clicar no botão, a mensagem Hello World seja exibida em uma caixa demensagens.Então,utilizaremososeguintecódigo:

privatevoidbutton1_Click(objectsender,EventArgse){MessageBox.Show(HelloWorld);}

Comoamensagemésomenteumtexto,ocompiladordoC#nosforçaacolocá-laentreaspasduplas.Portanto,ocódigodocliquedobotãoficaráassim:

privatevoidbutton1_Click(objectsender,EventArgse){MessageBox.Show("HelloWorld");

.

Page 19: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}

Ocódigocompletofica:

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;

namespaceform{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}

privatevoidbutton1_Click(objectsender,EventArgse){MessageBox.Show("HelloWorld");}}}

Nãosepreocupecomaslinhasdecódigoquenãoforamexplicadas.Entenderemosoqueelasfazemduranteocurso.

Aperte"F5"paraexecutarocódigodoformulário.Aoclicarno"button1",oresultadodeveseralgoparecidocomaimagemaseguir:

2.7EXERCÍCIOS

.

Page 20: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

1. Qualamensagemqueseráexibidanacaixadetextocriadapeloseguintecódigo?

MessageBox.Show("CursodeC#daCaelum");

HelloWorld

CursodeC#daCaelum

OláMundo

Caelum

Nenhumadasopções

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

Vimos que quando apertamos a tecla F5 do teclado dentro do Visual Studio, nosso programa éexecutado.Agoravamosentenderoqueaconteceu.

Quando pedimos para o Visual Studio executar uma aplicação, ele chama o compilador dalinguagem C# passando os arquivos de texto que contém o código da aplicação (código fonte doprograma). Caso o código fonte não tenha nenhum erro de sintaxe, o compilador gera o códigointermediário (CIL, Common Intermediate Language) que é entendido pela máquina virtual dalinguagem C#, a CLR (Common Language Runtime). O código CIL é colocado em um arquivoexecutável (arquivo com extensão .exe) dentro da pasta do projeto. Esse arquivo que é resultado dacompilaçãodoprogramaéchamadodeAssemblydentrodalinguagemC#.

Depoisdacompilação,oVisualStudioexecutaoassemblygeradonamáquinavirtualdoC#.ACLRporsuavezcarregaocódigoCILque foigeradopelocompiladoreoexecutanosistemaoperacional,masseaCLRinterpretasseocódigoCILpara linguagemdemáquina,odesempenhodoC#nãoseria

EditoraCasadoCódigocomlivrosdeumaformadiferente

2.8OQUEACONTECEUDURANTEAEXECUÇÃO?

.

Page 21: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

muito bom, e por isso, quando um programa C# é carregado pela CLR ele já é automaticamenteconvertidoparalinguagemdemáquinaporumprocessoconhecidocomoJIT(Just-in-time).EntãonoC#,ocódigosempreéexecutadocomomesmodesempenhodocódigodemáquina.

.

Page 22: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO3

Namaioriadosprogramasqueescrevemos,nãoestamosinteressadosemapenasmostrarumacaixademensagensparaousuário.Queremostambémarmazenareprocessarinformações.

Emumsistemabancário,porexemplo,estaríamosinteressadosemarmazenarosaldodeumacontaeonomedocorrentista.Paraarmazenaressesdados,precisamospedirparaoC#reservar regiõesdememória que serão utilizadas para armazenar informações. Essas regiões dememória são conhecidascomovariáveis.

As variáveis guardam informações de um tipo específico. Podemos, por exemplo, guardar umnúmerointeirorepresentandoonúmerodaconta,umtextopararepresentaronomedocorrentistaouum número real para representar o saldo atual da conta. Para utilizar uma variável, devemosprimeiramentedeclará-lanotextodoprograma.

Nadeclaraçãodeumavariável,devemosdizerseutipo(inteiro,textooureal,porexemplo)e,alémdisso,qualéonomequeusaremosparareferenciá-lanotextodoprograma.Paradeclararumavariáveldotipointeiroquerepresentaonúmerodeumaconta,utilizamososeguintecódigo:

intnumeroDaConta;

Repareno;nofinaldalinha.ComoadeclaraçãodeumavariáveléumcomandodalinguagemC#,precisamosdo;paraterminá-lo.

Alémdo tipoint (para representar inteiros), temos tambémos tiposdouble efloat (paranúmerosreais),string(paratextos),entreoutros.

Depois de declarada, uma variável pode ser utilizada para armazenar valores. Por exemplo, seestivéssemos interessados em guardar o valor 1 na variável numeroDaConta que declaramosanteriormente,utilizaríamososeguintecódigo:

numeroDaConta=1;

Lê-se"numeroDaContarecebe1".Quando,nomomentodadeclaraçãodavariável,sabemosqualseráseuvalor,podemosutilizaraseguintesintaxeparadeclarareatribuirovalorparaavariável.

doublesaldo=100.0;

VARIÁVEISETIPOSPRIMITIVOS

3.1OPERAÇÕESCOMVARIÁVEIS

.

Page 23: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Agoraque já sabemoscomoguardar informaçõesnoprograma,estamos interessadosemexecutaroperaçõesnessesvalores.Podeserinteressanteparaumcorrentistasaberqualseráosaldodesuacontaapósumsaquede10reais.Pararealizaressaoperação,devemossubtrair10reaisdosaldodaconta:

doublesaldo=100.0;saldo=saldo-10.0;

Nessecódigo,estamosguardandonavariávelsaldoovalordaconta100.0 (saldoantigo)menos10.0entãoseuvalorfinalseráde90.0.Damesmaformaquepodemossubtrairvalores,podemostambémfazersomas(comooperador+),multiplicações(operador*)edivisões(operador/).

Podemosaindaguardarovalordosaqueemumavariável:

doublesaldo=100.0;doublevalorDoSaque=10.0;saldo=saldo-valorDoSaque;

Depois de realizar o saque, queremosmostrar para o usuário qual é o saldo atual da conta. Paramostrarmosessainformação,utilizaremosnovamenteoMessageBox.Show:

MessageBox.Show("Osaldodacontaapósosaqueé:"+saldo);

Veja que, no código do saque, estamos repetindo o nome da variável saldo dos dois lados daatribuição.Quandotemosessetipodecódigo,podemosutilizarumaabreviaçãodisponibilizadapeloC#,ooperador-=:

doublesaldo=100.0;doublevalorDoSaque=10.0;saldo-=valorDoSaque;

QuandoocompiladordoC#encontraosaldo-=valorDoSaque, essa linhaé traduzidaparaaformaquevimosanteriormente:saldo=saldo-valorDoSaque.Alémdo-=,temostambémosoperadores+=(parasomas),*=(paramultiplicações)e/=(paradivisões).

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

Seuslivrosdetecnologiaparecemdoséculopassado?

.

Page 24: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Vimos que noC# toda variável possui um tipo, utilizamos oint quando queremos armazenarvalores inteiros edouble para números reais. Agora vamos descobrir quais são os outros tipos devariáveisdoC#.

Os tipos listadosnessa tabelasãoconhecidoscomotiposprimitivosouvalue types da linguagemC#. Toda vez que atribuímos um valor para uma variável de um tipo primitivo, o C# copia o valoratribuídoparadentrodavariável.

AgoraqueconhecemosostiposprimitivosdalinguagemC#,vamosvercomoéqueelesinteragemdentro de uma aplicação. Suponha que temos um código que declara uma variável do tipo inteiro edepoistentacopiarseuconteúdoparaumavariávellong:

intvalor=1;longvalorGrande=valor;

Nessecaso,comootamanhodeumavariávellongémaiordoqueodeumavariávelint,oC#sabe que podemos copiar o seu conteúdo sem perder informações e, por isso, esse é um código quecompilasemnenhumerro.Agoravamostentarcopiarointparaumavariáveldotiposhort:

intvalor=1;shortvalorPequeno=valor;

3.2TIPOSPRIMITIVOS

.

Page 25: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Nessecódigo,tentamoscopiaroconteúdodeumavariávelmaiorparadentrodeumadetamanhomenor.Essacópiapodeserperigosapoisovalorqueestánavariáveldotipointpodenãocabernavariávelshorte,porisso,ocompiladordoC#geraumerrodecompilaçãoquandotentamosfazeressaconversão.

Para forçarmos o compilador do C# a fazer uma conversão perigosa, precisamos utilizar umaoperaçãodoC#chamadacastingfalandoparaqualtipoqueremosfazeraconversão.

intvalor=1;shortvalorPequeno=(short)valor;

Alémdostiposprimitivos,oC#tambémpossuiumtipoespecíficoparaarmazenartextos.Notipostring,podemosguardarqualquervalorquesejadelimitadoporaspasduplas,porexemplo:

stringmensagem="MinhaMensagem";MessageBox.Show(mensagem);

Podemosjuntarovalordeduasvariáveisdotipostringutilizandoooperador+dalinguagem.Asomadestringséumaoperaçãoconhecidacomoconcatenação.

stringmensagem="Olá";stringnome="victor";

MessageBox.Show(mensagem+nome);

Esse código imprime o texto Olá victor em uma caixa de mensagens. Podemos utilizar aconcatenaçãoparaadicionaroconteúdodequalquervariávelemumastring:

intidade=25;stringmensagem="suaidadeé:"+idade;

MessageBox.Show(mensagem);

Essesegundocódigoimprimeotextosuaidadeé:25.

QuandoqueremosdocumentarosignificadodealgumcódigodentrodeumprogramaC#,podemosutilizarcomentários.Parafazermosumcomentáriodeumalinha,utilizamoso//.Tudoqueestiverdepoisdo//éconsideradocomentárioe,porisso,ignoradopelocompiladordalinguagem.

doublesaldo=100.0;//Issoéumcomentárioeseráignoradopelocompilador

Muitas vezes precisamos escrever diversas linhas de comentários para, por exemplo, documentarumalógicacomplexadaaplicação.Nessescasospodemosutilizarocomentáriodemúltiplaslinhasqueéinicializadoporum/*e terminadopelo*/.Tudoqueestiver entrea aberturaeo fechamentodocomentárioéignoradopelocompiladordalinguagem:

3.3ARMAZENANDOTEXTOEMVARIÁVEIS

3.4DOCUMENTANDOOCÓDIGOATRAVÉSDECOMENTÁRIOS

.

Page 26: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

/*Issoéumcomentáriodemúltiplaslinhas*/

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

Faça o código dos exercícios do capítulo dentro de botões no formulário do projeto inicial, cadaexercíciodeveficarnaaçãodeumbotãodiferente.

1. Crie3variáveiscomasidadesdosseusmelhoresamigose/oufamiliares.Algocomo:

intidadeJoao=10;intidadeMaria=25;

Emseguida,pegueessas3idadesecalculeamédiadelas.ExibaoresultadoemumMessageBox.

2. Oqueacontececomocódigoabaixo?

intpi=3.14;

Ocódigocompila,e"pi"guardaonúmero3

Ocódigocompila,e"pi"guarda3.14(inteirospodemguardarcasasdecimais)

Ocódigonãocompila,pois3.14não"cabe"dentrodeuminteiro

3. Executeotrechodecódigoaseguir.Oqueacontececomele?

doublepi=3.14;intpiQuebrado=(int)pi;MessageBox.Show("piQuebrado="+piQuebrado);

Repareo(int).Estamos"forçando"aconversãododoubleparauminteiro.

QualovalordepiQuebradonessecaso?

Agoraéamelhorhoradeaprenderalgonovo

3.5EXERCÍCIOS

.

Page 27: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

3.14

0

3

4. (Opcional) No colegial, aprendemos a resolver equações de segundo grau usando a fórmula deBhaskara.Afórmulaéassim:

delta=b*b-4*a*c;a1=(-b+raiz(delta))/(2*a);a2=(-b-raiz(delta))/(2*a);

Crie um programa com três variáveis inteiras, a, b, c, com quaisquer valores. Depois crie 3variáveisdouble,delta,a1,a2,comafórmulaanterior.

Imprimaa1ea2emumMessageBox.

Dica:Paracalcular raizquadrada,useMath.Sqrt(variavel).Não se esqueçaquenãopodemoscalculararaizquadradadenúmerosnegativos.

.

Page 28: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO4

Voltandoparanossoexemplodeaplicaçãobancária,queremospermitirumsaquesomenteseovaloraserretiradoformenorouigualaosaldodaconta,ouseja,seosaldodacontaformaiorouigualaovalordosaque,devemospermitiraoperação,docontrárionãopodemospermitirosaque.Precisamosfazerexecuçãocondicionaldecódigo.

NoC#,podemosexecutarcódigocondicionalutilizandoaconstruçãoif:

if(condicao){//Essecódigoseráexecutadosomenteseacondiçãoforverdadeira}

Nonossoexemplo,queremosexecutaralógicadesaqueapenasseosaldoformaiorouigualaovalordosaque:

doublesaldo=100.0;doublevalorSaque=10.0;if(saldo>=valorSaque){//códigodosaque.}

O código do saque deve diminuir o saldo da conta e mostrar uma mensagem para o usuárioindicandoqueosaqueocorreucomsucesso:

doublesaldo=100.0;doublevalorSaque=10.0;if(saldo>=valorSaque){saldo=saldo-valorSaque;MessageBox.Show("Saquerealizadocomsucesso");}

Repareque,seacontanãotiversaldosuficienteparaosaque,ousuárionãoéavisado.Entãoestamosna seguinte situação: "Se a conta tiver saldo suficiente, quero fazer o saque, senão, quero mostrar amensagemSaldoInsuficienteparaousuário".Parafazerisso,podemosusaroelsedoC#:

if(saldo>=valorSaque){//códigodosaque}else

ESTRUTURASDECONTROLE

4.1TOMANDODECISÕESNOCÓDIGO

.

Page 29: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{MessageBox.Show("SaldoInsuficiente");}

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

Reparenaexpressãoquepassamosparaoif:saldo>=valorSaque.Nele,utilizamosooperador"maiorouigual".Alémdele,existemoutrosoperadoresdecomparaçãoquepodemosutilizar:maior(>),menor(<),menorouigual(<=),igual(==)ediferente(!=).Podemostambémnegarumacondiçãodeumifutilizandoooperador!nafrentedacondiçãoqueseránegada.

No capítulo anterior, vimos que um valor tem um tipo associado em C#: 10 é um int ,"mensagem"éumastring.Damesmaforma,aexpressãosaldo>=valorSaquetambémtemumtipo associado: o tipo bool, que pode assumir os valores true (verdadeiro) ou false (falso).Podemosinclusiveguardarumvalordessetiponumavariável:

boolpodeSacar=(saldo>=valorSaque);

Tambémpodemosrealizaralgumasoperaçõescomvaloresdotipobool.Podemos,porexemplo,verificarseduascondiçõessãoverdadeirasaomesmotempousandoooperador&&(AND)parafazerumelógico:

boolrealmentePodeSacar=(saldo>=valorSaque)&&(valorSaque>0);

QuandoprecisamosdeumOUlógico,utilizamosooperador||:

//essacondiçãoéverdadeirase(saldo>=valorSaque)fortrue//ouse(valorSaque>0)forverdadeiro.boolrealmentePodeSacar=(saldo>=valorSaque)||(valorSaque>0);

Assim,podemosconstruircondiçõesmaiscomplexasparaumif.Por exemplo,podemosusaravariávelrealmentePodeSacardeclaradanoifqueverificaseoclientepodesacarounão:

Seuslivrosdetecnologiaparecemdoséculopassado?

4.2MAISSOBRECONDIÇÕES

.

Page 30: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

if(realmentePodeSacar){//códigodosaque}else{MessageBox.Show("SaldoInsuficiente");}

1. Qualéamensagemeovalordavariávelsaldoapósaexecuçãodoseguintecódigo?

doublesaldo=100.0;doublevalorSaque=10.0;if(saldo>=valorSaque){saldo-=valorSaque;MessageBox.Show("Saquerealizadocomsucesso");}else{MessageBox.Show("SaldoInsuficiente");}

mensagem:Saquerealizadocomsucesso;saldo:90.0

mensagem:SaldoInsuficiente;saldo90.0

mensagem:Saquerealizadocomsucesso;saldo:100.0

mensagem:SaldoInsuficiente;saldo100.0

mensagem:Saquerealizadocomsucesso;saldo:10.0

2. Qualéamensagemeovalordavariávelsaldoapósaexecuçãodoseguintecódigo?

doublesaldo=5.0;doublevalorSaque=10.0;if(saldo>=valorSaque){saldo-=valorSaque;MessageBox.Show("Saquerealizadocomsucesso");}else{MessageBox.Show("SaldoInsuficiente");}

mensagem:Saquerealizadocomsucesso;saldo:-5.0

mensagem:SaldoInsuficiente;saldo-5.0

mensagem:Saquerealizadocomsucesso;saldo:5.0

mensagem:SaldoInsuficiente;saldo5.0

4.3EXERCÍCIOSOPCIONAIS

.

Page 31: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

mensagem:Saquerealizadocomsucesso;saldo:10.0

3. Emalgunscasos,podemostermaisdeduasdecisõespossíveis.Obancopode,porexemplo,decidirquecontascomsaldomenorqueR$1000pagam1%detaxademanutenção,contascomsaldoentreR$1000eR$5000pagam5%econtascomsaldomaiorqueR$5000pagam10%.

Pararepresentaressetipodesituação,podemosusaroelseifdoC#,quefuncionaemconjuntocomoifquejáconhecemos.Vejacomoficariaasituaçãodescritaanteriormente:

doubletaxa;if(saldo<1000){taxa=0.01;}elseif(saldo<=5000){taxa=0.05;}else{taxa=0.1;}

OC#vaiprocessarascondiçõesnaordem,atéencontrarumaquesejasatisfeita.Ouseja,nasegundacondiçãodocódigo,sóprecisamosverificarquesaldoémenorouigualaR$5000,poisseoC#chegarnessacondiçãoéporqueelenãoentrounoprimeiroif, istoé, sabemosqueosaldo émaiorouigualaR$1000nesseponto.

Combasenisso,qualvaiseramensagemexibidapelocódigoseguinte?

doublesaldo=500.0;if(saldo<0.0){MessageBox.Show("Vocêestánonegativo!");}elseif(saldo<1000000.0){MessageBox.Show("Vocêéumbomcliente");}else{MessageBox.Show("Vocêémilionário!");}

"Vocêestánonegativo!"

"Vocêéumbomcliente"

Nenhumamensagem

"Vocêémilionário!"

"Vocêéumbomcliente",seguidade"Vocêémilionário!"

.

Page 32: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

4. Umapessoasópodevotaremeleiçõesbrasileirasseelaformaiorque16anoseforcidadãbrasileira.Crieumprogramacomduasvariáveis,intidade,boolbrasileira,efaçacomqueoprogramadigaseapessoaestáaptaavotarounão,deacordocomosdadosnasvariáveis.

5. Crie umprogramaque tenha uma variáveldoublevalorDaNotaFiscal e, de acordo com essevalor,oimpostodevesercalculado.Asregrasdecálculosão:

Seovalorformenorouiguala999,oimpostodeveserde2%Seovalorestiverentre1000e2999,oimpostodeveserde2.5%Seovalorestiverentre3000e6999,oimpostodeveserde2.8%

Seformaiorouiguala7000,oimpostodeveserde3%

ImprimaoimpostoemumMessageBox.

6. (Desafio)Dadooseguintecódigo:

intvalor=15;stringmensagem="";if(valor>10){mensagem="Maiorquedez";}else{mensagem="Menorquedez;}MessageBox.Show(mensagem);

Existeumaformadefazeroifdessecódigoumalinhasó,semusarapalavraifeelse.Pesquisesobreissoetentefazer.

.

Page 33: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO5

De volta ao exemplo da aula anterior, suponha agora que o cliente dessemesmo banco queira saberquanto ele ganhará, ao final de 1 ano, caso ele invista um valor. O investimento paga 1% do valorinvestidoaomês.

Porexemplo,seoclienteinvestirR$1000,00,aofinalde12meses,teráporvoltadeR$1126,82:noprimeiromês,R$1000,00+R$1000,001%=R$1010,00;nosegundomês,R$1010,00+R$1010,001%=R$1020,10;eassimpordiante.Ouseja,paracalcularoquantoele teráao finaldeumano,podemosmultiplicarovalorinvestido12vezespor1%.

Pararesolvermosesseproblema,precisamosfazerusodeumaestruturadecontrolequerepeteumdeterminadoblocodecódigoatéqueumacondiçãosejasatisfeita.Essaestruturarecebeonomedeloop.

ParafazerumloopnoC#,utilizaremos,inicialmente,ainstruçãofor.Oforéumainstruçãoquepossuitrêspartes:

A primeira parte é a inicialização, na qual podemos declarar e inicializar uma variável que seráutilizadanofor;A segunda parte é a condição do loop. Enquanto a condição do loop for verdadeira, o loopcontinuaráexecutando;Aterceiraparteéaatualização,naqualpodemosatualizarasvariáveisquesãoutilizadaspelofor.

Cadaumadaspartesdoforéseparadaporum;.

for(inicialização;condição;atualização){//Essecódigoseráexecutadoenquantoacondiçãoforverdadeira}

Vejaocódigoaseguir,porexemplo,emqueusamosumforquerepetiráocálculo12vezes:

doublevalorInvestido=1000.0;for(inti=1;i<=12;i+=1){valorInvestido=valorInvestido*1.01;}MessageBox.Show("Valorinvestidoagoraé"+valorInvestido);

Vejaquenossofor começa inicializandoavariáveli com1 e repete o códigodedentrodele

ESTRUTURASDEREPETIÇÃO

5.1REPETINDOUMBLOCODECÓDIGO

.

Page 34: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

enquantoovalordeiformenorouiguala12,ouseja,elesóparanomomentoemqueiformaiordoque12.Evejaque,acadaiteraçãodesseloop,ovalordeicresce(i+=1).Nofim,ocódigodedentrodoforserárepetido12vezes,comoprecisávamos.

Omesmoprogramapoderiaserescritoutilizando-seumwhile,emvezdeumfor:

doublevalorInvestido=1000.0;inti=1;while(i<=12){valorInvestido=valorInvestido*1.01;i+=1;}MessageBox.Show("Valorinvestidoagoraé"+valorInvestido);

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

NoC#quandoutilizamosowhile,acondiçãodoloopéchecadaantesdetodasasvoltas(iterações)dolaço,masesequiséssemosgarantirqueocorpodolaçosejaexecutadopelomenosumavez?Nessecaso,podemosutilizarumoutrotipodelaçodoC#queéodowhile:

do{//corpodoloop}while(condição);

Comodowhile a condiçãodo loop só é checadano fimda volta, ou seja, o corpodo loop éexecutado e depois a condição é checada, então o corpo do do...while sempre é executado pelomenosumavez.

Quandoqueremosincrementarovalordeumavariávelinteiraemumaunidade,vimosquetemos2

Agoraéamelhorhoradeaprenderalgonovo

5.2PARASABERMAISDOWHILE

5.3PARASABERMAISINCREMENTOEDECREMENTO

.

Page 35: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

opções:

intvalor=1;

valor=valor+1;//ouvalor+=1;

Porém,comoincrementarovalordeumavariáveléumaatividadecomumnaprogramação,oC#nosofereceooperador++pararealizaressetrabalho:

intvalor=1;valor++;

Temosaindaooperador--querealizaodecrementodeumavariável.

1. Qualéovalorexibidonoseguintecódigo:

inttotal=2;for(inti=0;i<5;i+=1){total=total*2;}MessageBox.Show("Ototalé:"+total);

256

64

128

512

2. FaçaumprogramaemC#queimprimaasomadosnúmerosde1até1000.

3. FaçaumprogramaemC#queimprimatodososmúltiplosde3,entre1e100.

Parasaberseumnúmeroémúltiplode3,vocêpodefazerif(numero%3==0).

4. (Opcional) Escreva um programa em C# que some todos os números de 1 a 100, pulando osmúltiplosde3.OprogramadeveimprimiroresultadofinalemumMessageBox.

Qualoresultado?

5. (Opcional)EscrevaumprogramaemC#queimprimetodososnúmerosquesãodivisíveispor3oupor4entre0e30.

6. (Opcional)FaçaumprogramaemC#queimprimaosfatoriaisde1a10.

Ofatorialdeumnúmeronénn-1n-2...atén=1.

5.4EXERCÍCIOS

.

Page 36: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Ofatorialde0é1

Ofatorialde1é(0!)*1=1

Ofatorialde2é(1!)*2=2

Ofatorialde3é(2!)*3=6

Ofatorialde4é(3!)*4=24

Façaumforqueinicieumavariáveln(número)como1efatorial(resultado)como1evariande1até10:

intfatorial=1;for(intn=1;n<=10;n++){

}

7. (Opcional)FaçaumprogramaemC#queimprimaosprimeirosnúmerosdasériedeFibonacciatépassar de 100.A série de Fibonacci é a seguinte: 0, 1, 1, 2, 3, 5, 8, 13, 21 etc... Para calculá-la, oprimeiroelementovale0,osegundovale1,daípordiante,on-ésimoelementovaleo(n-1)-ésimoelementosomadoao(n-2)-ésimoelemento(ex:8=5+3).

8. (Opcional)Façaumprogramaqueimprimaaseguintetabela,usandoforsencadeados:

124369481216nn*2n*3....n*n

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

EditoraCasadoCódigocomlivrosdeumaformadiferente

.

Page 37: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO6

Neste momento, queremos representar diversas contas em nosso banco. Uma conta bancária égeralmentecompostaporumnúmero,nomedotitularesaldo.Podemosguardaressasinformaçõesemvariáveis:

intnumeroDaConta1=1;stringtitularDaConta1="JoaquimJosé";doublesaldoDaConta1=1500.0;

Pararepresentaroutroscorrentistas,precisamosdenovasvariáveis:

intnumeroDaConta2=2;stringtitularDaConta2="SilvaXavier";doublesaldoDaConta2=2500.0;

Vejaque,comoasinformaçõesdascontasestãoespalhadasemdiversasvariáveisdiferentes,émuitofácilmisturarmosessasinformaçõesdentrodocódigo.Alémdisso,imaginequeantesdeadicionarmosacontanaaplicaçãoprecisamosfazerumavalidaçãodoCPFdotitular.Nessecasoprecisaríamoschamaruma função que executa essa validação, mas como podemos garantir que essa validação sempre éexecutada?

Esses pontos listados são alguns dos problemas do estilo de programação procedural. Quandotrabalhamos comprogramação procedural, os dados da aplicação ficam separados da implementaçãodaslógicasdenegócioe,alémdisso,émuitodifícilgarantirasvalidaçõesdosdadosdaaplicação.

Paracomeçarmoscomaorientaçãoaobjetos,vamosinicialmentepensarquaissãoas informaçõesquedescrevemumadeterminadaConta.Todacontabancáriapossuiumnúmero, titularesaldo.Pararepresentarmosacontacomessasinformaçõesdentrodoprojeto,noC#,precisamoscriarumaclasse.DentrodoC#adeclaraçãodaclasseéfeitautilizando-seapalavraclassseguidadonomedaclassequequeremosimplementar:

classConta{

}

OcódigodaclasseConta,porconvenção,deveficardentrodeumarquivocomomesmonomedaclasse,entãoaclasseContaserácolocadoemarquivochamadoConta.cs.

CLASSESEOBJETOS

6.1ORGANIZANDOOCÓDIGOCOMOBJETOS

.

Page 38: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Dentro dessa classe queremos armazenar as informações que descrevem as contas, fazemos issodeclarandovariáveisdentrodaclasse,essasvariáveissãoosatributos:

classConta{intnumero;stringtitular;doublesaldo;}

Porém,paraqueocódigodaaplicaçãopossalereescrevernessesatributos,precisamosdeclará-losutilizandoapalavrapublic:

classConta{//numero,titularesaldosãoatributosdoobjetopublicintnumero;publicstringtitular;publicdoublesaldo;}

Parautilizarmosaclassequecriamosdentrodeumaaplicaçãowindowsform,precisamoscriarumanovacontanocódigodoformulário,fazemosissoutilizandoainstruçãonewdoC#:

//códigodoformulárioprivatevoidbutton1_Click(objectsender,EventArgse){newConta();}

QuandoutilizamosonewdentrodocódigodeumaclasseestamospedindoparaoC#criarumanovainstânciadeContanamemória,ouseja,oC#alocarámemóriasuficienteparaguardartodasasinformaçõesdaContadentrodamemóriadaaplicação.

Alémdisso,onewpossuimaisumafunção,devolverareferência,umasetaqueapontaparaoobjetoemmemória,queseráutilizadaparamanipularmosaContacriada.PodemosguardaressareferênciadentrodeumavariáveldotipoConta:

//códigodoformulárioprivatevoidbutton1_Click(objectsender,EventArgse){Contac=newConta();}

Namemóriadaaplicaçãoteremosumasituaçãoparecidacomailustradanaimagemaseguir:

.

Page 39: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

VejaqueaclassefuncionacomoumareceitaqueensinaqualéoformatodeumaContadentrodaaplicação.AContaquefoicriadanamemóriapelooperadornewéchamadadeinstânciaouobjeto.

E agora para definirmos os valores dos atributos que serão armazenados naConta, precisamosacessaroobjetoquevivenamemória.Fazemosissoutilizandoooperador.doC#,informandoqualéoatributoquequeremosacessar.Para,por exemplo, guardarmosovalor1 comonúmeroda contaquecriamos,utilizamosocódigoaseguir:

//códigodoformulárioprivatevoidbutton1_Click(objectsender,EventArgse){Contac=newConta();c.numero=1;}

Comessecódigo,estamosnavegandonareferênciaarmazenadanavariávelc,eacessandoocamponúmerodoobjetoConta quevivenamemória.Dentrodesse campocolocamosovalor1.PodemosfazeromesmoparaosoutroscamposdaConta:

privatevoidbutton1_Click(objectsender,EventArgse){Contac=newConta();c.numero=1;c.titular="victor";c.saldo=100;}

Depoisdaexecuçãodessecódigo,teremosaseguintesituaçãonamemóriadaaplicação:

.

Page 40: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Veja que, quando utilizamos um objeto para guardar informações, todos os atributos ficamagrupados dentro de um único objeto na memória, e não espalhados dentro de diversas variáveisdiferentes.

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

Agoraqueconseguimoscriaraprimeiracontadaaplicação,vamostentarfazeralgumasoperações.Aprimeiraoperaçãoquequeremosimplementaréaoperaçãodetirardinheirodaconta.Paraisso,comovimosnocapítuloanterior,podemosutilizarooperador-=doC#:

Contac=newConta();c.numero=1;c.titular="victor";

EditoraCasadoCódigocomlivrosdeumaformadiferente

6.2EXTRAINDOCOMPORTAMENTOSATRAVÉSDEMÉTODOS

.

Page 41: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

c.saldo=100;//acontaterminacomsaldode50.0c.saldo-=50.0;

Masoqueaconteceriasetentássemostirarmais100.0dessaconta?

c.saldo-=100.0;

Ao executarmos essa segunda operação, a conta terminará com saldo de -50.0, porém nessesistemaascontasnãopodemficarcomsaldonegativo!Portanto,antesdetirarmosdinheirodaconta,precisamosverificarseelapossuisaldosuficiente.

if(c.saldo>=100.0){c.saldo-=100.0;}

Repare que teremos que copiar e colar essa verificação em todos os pontos da aplicação em quedesejamos fazer um saque, mas o que aconteceria se fosse necessário cobrar uma taxa em todos ossaques?Teríamosquemodificartodosospontosemqueocódigofoicopiado.Seriamais interessanteisolaressecódigodentrodeumcomportamentodaConta.

Alémdeatributos,osobjetos tambémpodempossuirmétodos.Osmétodossãoblocosdecódigoqueisolamlógicasdenegóciodoobjeto.EntãopodemosisolaralógicadosaquedentrodeummétodoSacadaclasseConta.

ParadeclararummétodochamadoSacanaclasseConta,utilizamosaseguintesintaxe:

classConta{//declaraçãodosatributos

publicvoidSaca(){//Implementaçãodométodo}}

DentrodessemétodoSaca,colocaremosocódigodalógicadesaque.

publicvoidSaca(){if(c.saldo>=100.0){c.saldo-=100.0;}}

Porém,nessecódigotemosdoisproblemas:nãopodemosutilizaravariávelc,poiselafoideclaradanoformulárioenãodentrodométodoeovalordosaqueestáconstante.

NessemétodoSaca, queremos verificar o saldo da conta em que ométodo foi invocado. Paraacessarmos a referência em que um determinadométodo foi chamado, utilizamos a palavra this.Entãoparaacessarmososaldodaconta,podemosutilizarthis.saldo:

.

Page 42: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicvoidSaca(){if(this.saldo>=100.0){this.saldo-=100.0;}}

PodemosutilizaroSacadentrodoformuláriocomoseguintecódigo:

Contac=newConta();//inicializaasinformaçõesdacontac.saldo=100.0;

//AgorachamaométodoSacaquefoidefinidonaclassec.Saca();

Agoravamosresolveroproblemadovalorfixodosaque.Quandoqueremospassarumvalorparaummétodo,precisamospassaressevalordentrodosparêntesesdachamadadométodo:

Contac=newConta();//inicializaasinformaçõesdacontac.saldo=100.0;

//AgorachamaométodoSacaquefoidefinidonaclassec.Saca(10.0);

PararecebermosovalorquefoipassadonachamadadoSaca,precisamosdeclararumargumentonométodo.Oargumentoéumavariáveldeclaradadentrodosparêntesesdométodo:

publicvoidSaca(doublevalor){if(this.saldo>=valor){this.saldo-=valor;}}

Ummétodopodeterqualquernúmerodeargumentos.Precisamosapenassepararadeclaraçãodasvariáveiscomumavírgula.

AgoraquecolocamosométodoSacadentrodaclasseConta,nãoprecisamosreplicarocódigodevalidaçãodosaqueemtodosospontosdocódigo,podemossimplesmenteutilizarométodocriado,alémdisso, se precisarmosmodificar a lógica do saque, podemos simplesmente atualizar o código daquelemétodo,umúnicopontodosistema.

Masda formaque foi implementado,ousuáriodessemétodonãosabeseosaque foiounãobemsucedido.Precisamosfazercomqueométododevolvaumvalorbooleanoindicandoseaoperaçãofoiounãobemsucedida.Devolveremostruecasoaoperaçãosejabemsucedidaefalsecasocontrário.Quandoummétododevolveumvalor,otipodovalordevolvidodeveficarantesdonomedométodoemsuadeclaração.Quandoummétodonãodevolvevaloralgum,utilizamosotipovoid.

6.3DEVOLVENDOVALORESDEDENTRODOMÉTODO

.

Page 43: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

//EstamosdeclarandoqueométododevolveumvalordotipoboolpublicboolSaca(doublevalor){//implementaçãodométodo}

Dentrodaimplementaçãodométodo,devolvemosumvalorutilizamosapalavrareturnseguidadovalorquedeveserdevolvido.EntãoaimplementaçãodoSacaficadaseguinteforma:

publicboolSaca(doublevalor){if(this.saldo>=valor){this.saldo-=valor;returntrue;}else{returnfalse;}}

Quando o C# executa um return, ele imediatamente devolve o valor e sai do método, entãopodemossimplificaraimplementaçãodoSacapara:

publicboolSaca(doublevalor){if(this.saldo>=valor){this.saldo-=valor;returntrue;}returnfalse;}

Noformuláriopodemosrecuperarovalordevolvidoporummétodo.

Contac=newConta();//inicializaosatributos

//Seacontativersaldosuficiente,deuCertoconteráovalortrue//senão,elaconteráfalsebooldeuCerto=c.Saca(100.0);

if(deuCerto){MessageBox.Show("Saquerealizadocomsucesso");}else{MessageBox.Show("SaldoInsuficiente");}

Oupodemosutilizaroretornodométododiretamentedentrodoif:

Contac=newConta();//inicializaosatributos

if(c.Saca(100.0)){

.

Page 44: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

MessageBox.Show("Saquerealizadocomsucesso");}else{MessageBox.Show("SaldoInsuficiente");}

Agoraqueterminamosdeimplementara lógicadesaquedaconta,vamostambémimplementarométododedepósito.Essemétodonãodevolveránenhumvalorereceberáumdoublecomoargumento:

publicvoidDeposita(doublevalor){this.saldo+=valor;}

Noformulárioprincipaldaaplicação,podemosinicializarosaldoinicialcomométodoDeposita:

Contac=newConta();c.Deposita(100.0);

Nesse código estamos tentando depositar 100 reais em uma conta que acabou de ser criada e ométodoDepositatentasomaros100.0novalorinicialdoatributosaldodaconta.Masqualéovalorinicialdeumatributo?

QuandodeclaramosumavariávelnoC#,elacomeçacomumvalor indefinido, logonãopodemosutilizá-laenquantoseuvalornãoforinicializado,porémalinguagemtrataosatributosdeumaclassedeforma diferenciada. Quando instanciamos uma classe, todos os seus atributos são inicializados paravalores padrão. Valores numéricos são inicializados para zero, o bool é inicializado para false eatributosqueguardamreferênciassãoinicializadosparaareferênciavazia(valornulldoC#).

Então,noexemplo,quandodepositamos100reaisnacontarecém-criada,estamossomando100nosaldoinicialdaconta,queézero,edepoisguardandooresultadodevoltanosaldodaconta.

Podemosmudar o valor padrão de um determinado atributo colocando um valor inicial em suadeclaração.Parainicializarmosacontacomsaldoinicialde100reaisaoinvésdezero,podemosutilizaroseguintecódigo:

classConta{publicdoublesaldo=100.0;

//outrosatributosemétodosdaclasse}

Agoratodacontacriadajácomeçarácomumsaldoinicialde100.0.

6.4VALORPADRÃODOSATRIBUTOSDACLASSE

.

Page 45: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

Agoravamostentarimplementaraoperaçãodetransferênciadedinheiroentreduascontas.DentrodaclasseContacriaremosmaisummétodochamadoTransfere, essemétodoreceberáovalordatransferênciaeascontasqueparticiparãodaoperação:

publicvoidTransfere(doublevalor,Contaorigem,Contadestino){//implementaçãodatransferência}

Mas será que realmente precisamos receber as duas contas como argumento do métodoTransfere?Vamosvercomoessemétodoseráutilizadodentrodocódigodoformulário:

Contavictor=newConta();//inicializaçãodacontavictor.saldo=1000;

Contaguilherme=newConta();//inicializaçãodaconta

//Agoravamostransferirodinheirodacontadovictorparaadoguilhermevictor.Transfere(10.0,victor,guilherme);

Reparequenousodométodoestamosrepetindoduasvezesavariávelvictor,porémissonãoénecessário. Podemos utilizar o this para acessar a conta de origem dentro do método, então naverdadeométodoTransfereprecisareceberapenasacontadedestino:

publicvoidTransfere(doublevalor,Contadestino){//implementaçãodatransferência}

Antes de tirarmos dinheiro da conta de origem (this), precisamos verificar se ela tem saldosuficiente, somentenessecasoqueremossacarodinheirodacontadeorigemedepositarnacontade

JáconheceoscursosonlineAlura?

6.5MAISUMEXEMPLO:TRANSFERE

.

Page 46: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

destino:

publicvoidTransfere(doublevalor,Contadestino){if(this.saldo>=valor){this.saldo-=valor;destino.saldo+=valor;}}

Masessecomportamentodeverificar seaconta temsaldosuficienteantesde realizaro saqueéocomportamentodométodoSacaquefoiimplementadoanteriormente,alémdisso,somarumvalornosaldoéaoperaçãoDepositadaconta.Portanto,podemosutilizarosmétodosSaca eDepositaexistentesparaimplementaroTransfere:

publicvoidTransfere(doublevalor,Contadestino){if(this.Saca(valor)){destino.Deposita(valor);}}

Quando criamos uma classe, é importante lembrarmos que seu código será lido por outrosdesenvolvedoresdaequipee,porisso,érecomendávelseguirpadrõesdenomenclatura.

Quandocriamosumaclasse,arecomendaçãoéutilizaroPascalCasingparanomearaclasse:

Seonomedaclasseécompostoporumaúnicapalavra,colocamosaprimeiraletradessapalavraemmaiúscula(contasetornaConta);Seonomeécompostopordiversaspalavras,juntamostodasaspalavrascolocandoaprimeiraletradecadapalavraemmaiúscula(segurodevidasetornaSeguroDeVida).

Nocasodonomedemétodos,aconvençãotambéméutilizaroPascalCasing(SacaeDeposita,porexemplo).

Paraargumentosdemétodos,arecomendaçãoéutilizaroPascalCasingporémcomaprimeiraletraemminúscula(valorDoSaque,porexemplo),umaconvençãochamadaCamelCasing.

VocêpodeencontrarasrecomendaçõesdaMicrosoftnesselink:http://msdn.microsoft.com/en-us/library/ms229040(v=vs.110).aspx

1. Oqueumaclassetem?

6.6CONVENÇÃODENOMES

6.7EXERCÍCIOS

.

Page 47: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Sóosatributosdeumaentidadedosistema;

Sóatributosousómétodosdeumaentidadedosistema;

Sóosmétodosdeumaentidadedosistema;

Atributosemétodosdeumaentidadedosistema.

2. VamoscriaraclasseContadentrodoprojetoinicialutilizandooVisualStudio.

No Visual Studio clique com o botão direito no nome do projeto e selecione a opção Add >

Class...

DentrodajanelaabertapeloVisualStudio,precisamosdefinirqualéonomedaclassequequeremoscriar.EscolhaonomeConta:

.

Page 48: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Depoisdecolocaronomedaclasse,cliquenobotãoAdd.Comisso,oVisualStudiocriaráumnovoarquivo dentro do Projeto, o Conta.cs. Todo o código da classe Conta ficará dentro dessearquivo:

classConta{//Ocódigodaclasseficaaquidentro!}

Agora declare os seguintes atributos dentro da Conta:saldo (double), titular (string) enumero(int).

3. QualdoscomandosaseguirinstanciaumanovaConta?

Contaconta=Conta();

Contaconta=newConta();

Contaconta=Conta.new();

4. Levandoemconsideraçãoocódigo:

Contac=newConta();c.saldo=1000.0;

Qualdaslinhasaseguiradiciona200reaisnessesaldo?

saldo+=200;

c.saldo+=200;

Contac.saldo+=200;

.

Page 49: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Conta.saldo+=200;

5. AgoravamostestaraclasseContaqueacabamosdecriar.Coloqueumnovobotãonoformuláriodaaplicação.Dêumduplocliquenessebotãoparadefinirmosqualseráocódigoexecutadonocliquedobotão.

privatevoidbutton1_Click(objectsender,EventArgse){//açãodobotãoaqui.}

Dentrodocódigodessebotão,instancieumanovaContaetentefazeralgunstestespreenchendoemostrandoseusatributosatravésdoMessageBox.Show.Porexemplo:

privatevoidbutton1_Click(objectsender,EventArgse){ContacontaVictor=newConta();contaVictor.titular="victor";contaVictor.numero=1;contaVictor.saldo=100.0;

MessageBox.Show(contaVictor.titular);}

Tente fazer testes com diversas contas e veja que cada instância de conta possui seus própriosatributos.

6. AgoravamosimplementarmétodosnaclasseConta.ComeçaremospelométodoDeposita,essemétodonãodevolvenada edeve receberumargumentodo tipodouble que é o valor que serádepositadonaConta.Asuaclassedeveficarparecidacomaquesegue:

//dentrodoarquivoConta.cs

classConta{//declaraçãodosatributos

publicvoidDeposita(doublevalor){//oquecolocaraquinaimplementação?}}

DepoisdeimplementarométodoDeposita,implementetambémométodoSaca. Ele tambémnãodevolvevaloralgumerecebeumdoublequeéovalorqueserásacadodaconta.

7. Agoravamostestarosmétodosqueacabamosdecriar.Naaçãodobotãoqueutilizamosparatestaraconta,vamosmanipularosaldoutilizandoosmétodosDepositaeSaca:

privatevoidbutton1_Click(objectsender,EventArgse){ContacontaVictor=newConta();contaVictor.titular="victor";contaVictor.numero=1;contaVictor.Deposita(100);

.

Page 50: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

MessageBox.Show("Saldo:"+contaVictor.saldo);contaVictor.Saca(50.0);MessageBox.Show("Saldo:"+contaVictor.saldo);}

Tente fazer depósitos e saques em várias instâncias diferentes deConta, repare que dentro dosmétodosavariávelthispossuiovalordareferênciaemqueométodofoiinvocado.

8. Qualasaídadocódigoaseguir:

Contamauricio=newConta();mauricio.saldo=2000.0;

Contaguilherme=newConta();guilherme.saldo=5000.0;

mauricio.saldo-=200.0;guilherme.saldo+=200.0;

MessageBox.Show("mauricio="+mauricio.saldo);MessageBox.Show("guilherme="+guilherme.saldo);

mauricio=2200.0eguilherme=4800.0

mauricio=2200.0eguilherme=5200.0

mauricio=1800.0eguilherme=5000.0

mauricio=1800.0eguilherme=5200.0

9. Qualasaídadocódigoaseguir?

Contamauricio=newConta();mauricio.numero=1;mauricio.titular="Mauricio";mauricio.saldo=100.0;

Contamauricio2=newConta();mauricio2.numero=1;mauricio2.titular="Mauricio";mauricio2.saldo=100.0;

if(mauricio==mauricio2){MessageBox.Show("Ascontassãoiguais");}else{MessageBox.Show("Ascontassãodiferentes");}

Ascontassãoiguais

Ascontassãodiferentes

Nãoémostradonenhumamensagem

.

Page 51: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

10. Qualasaídadocódigoaseguir:

Contamauricio=newConta();mauricio.saldo=2000.0;

Contacopia=mauricio;copia.saldo=3000.0;

MessageBox.show("mauricio="+mauricio.saldo);MessageBox.show("copia="+copia.saldo);

mauricio=2000.0ecopia=3000.0

mauricio=3000.0ecopia=2000.0

mauricio=2000.0ecopia=2000.0

mauricio=3000.0ecopia=3000.0

11. (Opcional) Implemente ométodo Transfere que recebe o valor da transferência e a conta dedestino.FaçacomqueelereutilizeasimplementaçõesdosmétodosSacaeDeposita.

12. (Opcional)Vamos adicionar uma validação nométodoSaca daConta.Modifique ométodoSaca para que ele não realize o saque caso o saldo atual da conta seja menor do que o valorrecebidocomoargumento.

13. (Opcional)ModifiqueométodoSaca comvalidaçãoparaqueeledevolvaovalortrue casoosaque tenha sido realizado com sucesso efalse caso contrário.Depoismodifique o código dobotãodetestedacontaparaqueeleutilizeovalordevolvidopelométodoSacaparamostrarumamensagemparaousuário.Casoosaquesejabemsucedido,queremosmostraramensagem"Saquerealizadocomsucesso",senão,mostraremos"Saldoinsuficiente"

14. (Opcional)AgoraaltereométodoSacadaclasseConta.LimiteovalordosaqueparaR$200,00casooclientesejamenordeidade.

Lembre-sequeaindaénecessáriovalidarseovalorasersacadoémenorouigualaosaldoatualdoclienteeémaiordoqueR$0,00.

.

Page 52: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

Quandoabrimosumacontanobanco, temosque fornecerumasériede informações:nome,CPF,RGeendereço.

Vimosquequandoqueremosarmazenarinformaçõesemumaclasse,devemoscriaratributos.Masem qual classe colocar esses novos atributos? Claramente essas informações não pertencem a umaConta.Essesdadospertencemaotitulardaconta,ouseja,essasinformaçõespertencemaoclientedobanco.

Entãodevemosarmazená-lasemumaclasseCliente.

classCliente{publicstringnome;publicstringcpf;publicstringrg;publicstringendereco;}

Sabemostambémquetodacontaestáassociadaaumcliente,ouseja,acontaguardaumareferênciaaoclienteassociado.

classConta{//outrosatributosdaConta

publicClientetitular;

//comportamentosdaconta}

Agora,quandovamoscriarumaconta,podemostambémcolocarseutitular.

Clientevictor=newCliente();victor.nome="victor";

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

6.8COMPOSIÇÃODECLASSES

.

Page 53: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

ContaumaConta=newConta();umaConta.titular=victor;

Vimos também que o atributo titular guarda uma referência(seta) para uma instância deCliente (objeto namemória). Logo, a atribuiçãoumaConta.titular=victor está copiando areferênciadavariávelvictorparaoatributotitular.

PodemosmodificarosatributosdoClienteatravésdareferênciaguardadanoatributotitulardaConta.

Clientevictor=newCliente();victor.nome="victor";

ContaumaConta=newConta();umaConta.titular=victor;

umaConta.titular.rg="12345678-9";

//MostraonomevictorMessageBox.Show(umaConta.titular.nome);

//Mostraotexto12345678-9MessageBox.Show(victor.rg);

1. Crie a classe Cliente contendo os atributos nome (string), rg (string), cpf (string) eendereco(string).ModifiqueaclasseContaefaçacomqueseuatributotitularsejadotipoClienteaoinvésdestring.

Tome cuidado.Após essamodificação não poderemos atribuir o nomedo cliente diretamente aoatributotitulardaConta.Paradefinironomedotitular,precisaremosdeumcódigoparecidocomoquesegue:

Contaconta=newConta();Clientecliente=newCliente();conta.titular=cliente;conta.titular.nome="Victor";

2. Qualasaídaqueseráimpressaaoexecutaroseguintetrechodecódigo?

ContaumaConta=newConta();Clienteguilherme=newCliente();guilherme.nome="GuilhermeSilveira";umaConta.titular=guilherme;

MessageBox.Show(umaConta.titular.nome);

GuilhermeSilveira

Serámostradoumacaixademensagemsemnenhumamensagem

Ocódigonãocompila

6.9EXERCÍCIOS

.

Page 54: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

3. Qualasaídaqueseráimpressaaoexecutaroseguintetrechodecódigo?

ContaumaConta=newConta();Clienteguilherme=newCliente();guilherme.rg="12345678-9";

umaConta.titular=guilherme;umaConta.titular.rg="98765432-1";

MessageBox.Show(guilherme.rg);

98765432-1

12345678-9

rg

Nãoseráimpressonada

4. (Opcional)CriemaisumatributonaclasseClientequeguardaaidadedapessoa.Nonossocaso,aidadeéumnúmerointeiro.

Tambémcrieumcomportamento(método)comonomeEhMaiorDeIdadenaclasseClientequenãorecebenenhumargumentoeretornaumbooleanoindicandoseoclienteémaiorde idadeounão.QuandoumapessoaémaiordeidadenoBrasil?

.

Page 55: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO7

Nessemomento, nossa classe Conta possui um numero, saldo e cliente titular, além decomportamentosquepermitemsacaredepositar:

classConta{publicintnumero;publicdoublesaldo;

publicClientetitular;

publicvoidSaca(doublevalor){this.saldo-=valor;}

publicvoidDeposita(doublevalor){this.saldo+=valor;}}

SedesejamosefetuarumsaqueouumdepósitoemumaContaqualquer,fazemos:

conta.Saca(100.0);conta.Deposita(250.0);

Masoqueaconteceseummembrodaequipefaz:

conta.saldo-=100.0;

Nada nos impede de acessar os atributos diretamente. Em três partes distintas do nosso softwaretemostalcódigo:

//emumarquivoconta.saldo-=100.0;

//emoutroarquivoconta.saldo-=250.0;

//emoutroarquivoconta.saldo-=371.0;

Agora imaginequeobancomudearegradesaque:agoraacadasaquerealizado,obancocobrará0.10centavos.Ouseja,seousuáriosacar10.0reais,énecessáriotirardesuaconta10.10reais.Temosquealterartodosospontosdenossaaplicaçãoqueacessamesseatributo!Masnossabasedecódigopode

ENCAPSULAMENTOEMODIFICADORESDEACESSO

.

Page 56: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

sermuitograndeeémuitocomumesquecermosondeequemestáacessandoesseatributo,deixandobugs toda vezque esquecemosde alterar algum lugar. Se tivermos essa linha espalhada300vezes emnosso sistema, precisaremos encontrar todas essas 300 linhas e fazer a alteração.Muito complicado ecustoso!

OqueaconteceriaaousarmosométodoSaca():

//emumarquivoconta.Saca(100.0);

//emoutroarquivoconta.Saca(250.0);

//emoutroarquivoconta.Saca(371.0);

Como refletiríamos a alteraçãona regrado saquede tirar 10 centavos?Precisamos alterarapenasumavezométodoSaca(),aoinvésdealterartodasaslinhasqueacessamoatributodiretamente!

Quando liberamos o acesso aos atributos da classe Conta, estamos permitindo que qualquerprogramadorfaçaasuaprópriaimplementaçãonãoseguradalógicadesaquedaformaquequiser.Seamodificaçãodoatributo ficasse restritaàclassequeodeclara, todosquequisessemsacaroudepositardinheironacontateriamdefazê-loatravésdemétodosdaclasse.Nessecaso,searegradesaquemudarnofuturo,modificaremosapenasométodoSaca.

Na orientação a objetos, esconder os detalhes de implementação de uma classe é um conceitoconhecidocomoencapsulamento.Comoosdetalhesdeimplementaçãodaclasseestãoescondidos,todoo acessodeve ser feito atravésde seusmétodospúblicos.Nãopermitimos aos outros saberCOMO aclassefazotrabalhodela,mostrandoapenasOQUÊelafaz.

Vejaalinhaconta.Saca(100.0);.Sabemosoquêessemétodofazpeloseunome.Mascomoelefaz o trabalho dele só saberemos se entrarmos dentro de sua implementação. Portanto, ocomportamentoestáencapsuladonessemétodo.

Mas ainda não resolvemos o problema de evitar que programadores façam uso diretamente doatributo.Qualquerumaindapodeexecutarocódigoabaixo:

conta.saldo-=371.0;

Para isso,precisamosesconderoatributo.Queremosdeixá-loprivadoparaquesomenteaprópriaclasseConta possautilizá-lo.Nesse casoqueremosmodificaro acesso ao atributoparaque ele sejaprivado,private:

classConta{//outrosatributosaqui

7.1ENCAPSULAMENTO

.

Page 57: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

privatedoublesaldo;

publicvoidSaca(doublevalor){this.saldo-=valor;}

publicvoidDeposita(doublevalor){this.saldo+=valor;}}

Atributosemétodosprivatesãoacessadosapenaspelaprópriaclasse.Ouseja,ométodoSaca(),porexemplo,conseguefazeralteraçõesnele.Masoutrasclassesnãoconseguemacessá-lodiretamente!Ocompiladornãopermite!

Osatributosdeumaclassesãodetalhesdeimplementação,portantomarcaremostodososatributosdacontacomapalavraprivate:

classConta{privateintnumero;privatedoublesaldo;privateClientetitular;

publicvoidSaca(doublevalor){this.saldo-=valor;}

publicvoidDeposita(doublevalor){this.saldo+=valor;}}

Ótimo.Agoraoprogramadoréforçadoapassarpelosmétodosparaconseguirmanipularosaldo.Setentarmos,porexemplo,escrevernosaldodaContaapartirdocódigodeumformulário,teremosumerrodecompilação:

Contac=newConta();//Alinhaabaixogeraumerrodecompilaçãoc.saldo=100.0;

Mas agora temos outro problema. Se quisermos exibir o saldo não conseguiremos. O privatebloqueiatantoaescrita,quantoaleitura!

.

Page 58: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

VimosquepodemosproibiroacessoexternoaumatributoutilizandooprivatedoC#,masoprivatetambém bloqueia a leitura do atributo, logo para recuperarmos seu valor, precisamos de um novométododentrodaclassequenosdevolveráovaloratualdoatributo:

classConta{privatedoublesaldo;

privateintnumero;

//outrosatributosemétodosdaconta

publicdoublePegaSaldo(){returnthis.saldo;}}

Agoraparamostrarmososaldoparaousuário,utilizaríamososeguintecódigo:

Contaconta=newConta();//inicializaaconta

MessageBox.Show("saldo:"+conta.PegaSaldo());

Além disso, a conta precisa de um número, mas como ele foi declarado como private, nãopodemosacessá-lodiretamente.Precisaremosdeumnovométodoparafazeressetrabalho:

classConta{privateintnumero;

//outrosatributosemétodosdaconta

publicvoidColocaNumero(intnumero)

JáconheceoscursosonlineAlura?

7.2CONTROLANDOOACESSOCOMPROPERTIES

.

Page 59: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{this.numero=numero;}}

Paracolocarmosonúmeronaconta,teríamosqueexecutaressecódigo:

Contaconta=newConta();

conta.ColocaNumero(1100);

//utilizaacontanocódigo

VejaquecomissonósconseguimoscontrolartodooacessoaclasseConta,masparaescrevermosoulermosovalordeumatributoprecisamosutilizarosmétodos.Oidealseriautilizarmosumasintaxeparecidacomadeacessoaatributos,porémcomocontrolequeométodonosoferece.Pararesolveresseproblema,oC#nosofereceasproperties(propriedades).

Adeclaraçãodeumapropriedadeéparecidacomadeclaraçãodeumatributo,porémprecisamosfalaroquedeveserfeitonaleitura(get)enaescrita(set)dapropriedade

classConta{privateintnumero;

publicintNumero{get{//códigoparalerapropriedade}

set{//códigoparaescrevernapropriedade}}}

Naleituradapropriedade,queremosdevolverovalordoatributonumerodaConta:

classConta{privateintnumero;

publicintNumero{get{returnthis.numero;}}}

Comisso,podemoslerapropriedadeNumerocomoseguintecódigo:

Contac=newConta();MessageBox.Show("numero:"+c.Numero);

.

Page 60: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Veja que o acesso ficou igual ao acesso de atributos, porémquando tentamos ler o valor de umapropriedade estamos na verdade executando um bloco de código (get da propriedade) da classeConta.Paradefinirmosonúmerodaconta,utilizaremosocódigo:

Contac=newConta();c.Numero=1;

Quandotentamosescreveremumapropriedade,oC#utilizaoblocosetparaguardarseuvalor.Dentrodoblocoset, o valor que foi atribuído àpropriedade ficadentrodeumavariável chamadavalue,entãopodemosimplementarosetdaseguinteforma:

classConta{privateintnumero;

publicintNumero{//declaraçãodogetset{this.numero=value;}}}

Podemos também declarar uma propriedade que tem apenas o get, sem o set. Nesse caso,estamos declarando uma propriedade que pode ser lidamas não pode ser escrita.Com as propertiesconseguimoscontrolarcompletamenteoacessoaosatributosdaclasseutilizandoasintaxedeacessoaosatributos.

Utilizando as properties, conseguimos controlar o acesso às informações da classe, porém, comovimos,declararumapropertyébemtrabalhoso.Precisamosdeumatributoparaguardarseuvalor,alémdisso,precisamosdeclararogeteoset.

Para facilitar a declaração das properties, a partir do C# 3.0, temos as propriedades que sãoimplementadasautomaticamentepelocompilador,asauto-implementedproperties.Paradeclararmosumaauto-implementedpropertyparaexporonúmerodaconta,utilizamososeguintecódigo:

classConta{publicintNumero{get;set;}}

Essecódigofazcomqueocompiladordeclareumatributodotipoint(cujonomesóéconhecidopelocompilador)egereocódigoparaapropriedadeNumerocomumget eumset que leemeescrevemnoatributodeclarado.Reparequeaoutilizarmosasauto-implementedproperties,sópodemosacessarovalordoatributodeclaradoatravésdapropriedade.

7.3SIMPLIFICANDOADECLARAÇÃODEPROPRIEDADESCOMAUTO-IMPLEMENTEDPROPERTIES

.

Page 61: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Todavezquedeclaramosumauto-implementedproperty,precisamossempredeclararumget eumsetparaapropriedade,porémpodemoscontrolaravisibilidadetantodogetquantodoset.Porexemplo,nocasodosaldo,queremospermitirquequalquerumleiaosaldodaconta,porémapenasaprópriacontapodealterá-lo.Nessecaso,utilizamososeguintecódigo:

classConta{//outraspropriedades

//getépúblicoepodeseracessadoporqualquerclasse//setéprivadoeporissosópodeserusadopelaconta.publicdoubleSaldo{get;privateset;}

//restodocódigodaclasse.}

Agoravamosverumcódigoquetentalereescrevernaspropriedadesquedeclaramos:

Contac=newConta();

c.Numero=1;//funcionapoisosetdoNumeroépúblicoMessageBox.Show("numero:"+c.Numero);//funcionapoisogetdoNumeroépúblico

c.Saldo=100.0;//setdoSaldoéprivado,entãotemosumerroMessageBox.Show("saldo"+c.Saldo);//funcionapoisogetdoSaldoépúblico.

Veja que tanto declarando properties explicitamente quanto utilizando as auto-implementedproperties,temosocontroletotalsobrequaisinformaçõesserãoexpostaspelaclasse.

Entãodevemosutilizarpropertiestodavezquequeremosexporalgumainformaçãodaclasse.Nuncadevemosexporatributosdaclasse(utilizandoopublic),poisnuncaqueremosexporosdetalhesdeimplementaçãodaclasse.

AconvençãodenomesdefinidaparapropertiesdoC#éamesmaconvençãodenomesutilizadaparaclasses,ouseja,utilizandooPascalCasing(Todasaspalavrasdonomesãoconcatenadasecadapalavratemainicialmaiúscula,porexemplo:numerodobanco=>NumeroDoBanco)

7.4CONVENÇÃODENOMEPARAPROPERTY

.

Page 62: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

1. Qualocomportamentodoatributoabaixo:

publicintNumero{get;privateset;}

Onúmeropodeserlido,masnãopodeseralteradoporoutrasclasses.

Onúmeronãopodeserlido,maspodeseralteradoporoutrasclasses.

Onúmeronãopodenemserlidonemseralteradoporoutrasclasses.

Onúmeropodeserlidoealteradoporoutrasclasses.

2. Sobreocódigoabaixoéválidoafirmarque...

Contac=newConta();doublevalorADepositar=200.0;c.Saldo+=valorADepositar;

Aoperaçãodedepósitofoiimplementadacorretamente.

Aoperaçãodedepósitonãoestáencapsulada,podendogerarproblemasfuturosdemanutenção.

Aoperaçãodedepósitonãoestáencapsulada,facilitandoamanutençãofuturadocódigo.

3. Oqueéencapsulamento?

ÉdeixarbemclaroparatodosCOMOaclassefazotrabalhodela.

ÉautilizaçãodePropertiesemqualquerumadesuasvariações.

Émanipularealteraratributosdiretamente,sempassarporummétodoespecífico.

ÉesconderCOMOaclasse/métodofazsuatarefa.Casoaregramude, temosquealterarapenas

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

7.5EXERCÍCIOS

.

Page 63: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

umpontodocódigo.

4. Qualoproblemadoatributoabaixo:

publicdoubleSaldo{get;set;}

Nenhum.Eleestáencapsulado,afinalusamosProperties.

Aoinvésdepublic,deveríamosusarprivate.

O atributo Saldo pode ser manipulado por outras classes. Isso vai contra a regra doencapsulamento. De nada adianta criar Properties e permitir que todos os atributos sejammodificadospelasoutrasclasses.

5. TransformeosatributosdaclasseContaempropriedades.Permitaqueosaldodacontasejalido,porémnãosejaalteradoforadaclasse,alteretambémocódigodasclassesqueutilizamacontaparaqueelasacessemaspropriedadesaoinvésdosatributosdiretamente.

Quando escrevemos uma aplicação grande, muitas vezes utilizamos bibliotecas que sãodesenvolvidas por outras pessoas, as DLLs (Dynamic Link Library). E muitas vezes a aplicaçãoprecisacompartilharclassescomadllimportadanocódigo.

QuandodeclaramosumaclassenoC#,porpadrãoelasópodeservistadentrodopróprioprojeto(visívelapenasnoassemblyqueadeclarou),esseéumníveldevisibilidadeconhecidocomointernal.Quandoqueremostrabalharcombibliotecasexternasaoprojeto,nossasclassesprecisamserdeclaradascomavisibilidadepublic:

publicclassAtualizadorDeContas{//Implementaçãodaclasse}

Comessamodificação,aclasseAtualizadorDeContasévisívelinclusiveforadoassemblyqueadeclarou,ouseja,podemosutilizá-laemqualquerpontodocódigo.

DentrodessaclasseAtualizadorDeContas,vamosdeclararummétodochamadoAtualizaquerecebeumaContacomoargumento.

publicclassAtualizadorDeContas{publicvoidAtualiza(Contaconta){

}}

Comoesseéummétodopúblicodentrodeumaclassepública,elepodeserutilizadoemqualquer

7.6PARASABERMAIS:VISIBILIDADEINTERNAL

.

Page 64: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

ponto do código, inclusive em outros assemblies. Porém se a classe Conta for uma classe comvisibilidadeinternal, teremos ummétodo que pode ser visto em todos os pontos do código, querecebe um argumento visível apenas dentro do assembly que o declarou, ou seja, temos umainconsistêncianasvisibilidades.

Quando o compilador do C# detecta uma inconsistência de visibilidade, ele gera um erro decompilação avisando quais são os métodos e classes que estão inconsistentes. Para corrigirmos oproblema de inconsistência do exemplo do AtualizadorDeContas , precisamos declarar a classeContacomopublic:

publicclassConta{//implementaçãodaclasse}

Ou alternativamente, podemos deixar a classeAtualizadorDeContas ou ométodo Atualizacomvisibilidadeinternal:

//internaléavisibilidadepadrãoparaaclasse,//portantoapalavrainternaléopcionalinternalclassAtualizadorDeContas{//implementaçãodaclasse}

.

Page 65: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO8

Comoquevimosnoscapítulosanteriores,nósprecisamoslembrardecolocaronomeapóscriarmosumnovoclienteemnossosistema.Issopodeservistonocódigoaseguir:

Clienteguilherme=newCliente();guilherme.Nome="Guilherme";

Eseesquecermosdechamarasegundalinhadessecódigo,teremosumclientesemnome.Mas,seráquefazsentidoexistirumclientesemnome?

Paraevitarisso,aoconstruirnossoobjetotemosqueobrigarodesenvolvedorafalarqualonomedoCliente.Istoé,queremossercapazesdealterarocomportamentodaconstruçãodoobjeto.

Queremosdefinirumnovocomportamentoquedirácomoseráconstruídooobjeto.Algocomo:

Clienteguilherme=newCliente("GuilhermeSilveira");

Note que esse comportamento que desejamos lembra um comportamento normal, passandoargumentos,mas com a característica especial de ser quem constrói umobjeto. Esse comportamentorecebeonomedeconstrutor.Ecomodefini-lo?Similarmenteaumcomportamentoqualquer:

classCliente{//OutrosatributosdaclasseClientepublicstringNome{get;set;}

publicCliente(stringnome){this.Nome=nome;}}

Vimosquequandocriamosumconstrutornaclasse,oC#usaoconstrutorcriadoparainicializaroobjeto,porémoqueacontecequandonãotemosnenhumconstrutornaclasse?Quandoumaclassenãotem nenhum construtor, o C# coloca um construtor padrão dentro da classe. Esse construtor nãorecebe argumentos e não executa nenhuma ação, ou seja, um construtor que não recebe nenhumargumentoetemocorpovazio.

Na seção anterior definimos um construtor dentro da classe cliente que inicializa a propriedade

CONSTRUTORES

8.1MÚLTIPLOSCONSTRUTORESDENTRODACLASSE

.

Page 66: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

nome,masesequiséssemosinicializartambémaidadedoClienteduranteaconstruçãodoobjeto?Nessecaso,precisaríamosdeumconstrutoradicionalnaclasseCliente:

classCliente{publicstringNome{get;set;}

publicintIdade{get;set;}

//construtorquesórecebeonomepublicCliente(stringnome){this.Nome=nome;}//construtorquerecebeonomeeaidadepublicCliente(stringnome,intidade){this.Nome=nome;this.Idade=idade;}}

Veja que definimos duas versões diferentes do construtor da classe, uma que recebe apenas astringnomeeoutraquerecebestringnomeeintidade.Quandocolocamosdiversasversõesdoconstrutordentrodeumaclasse,estamosfazendoumasobrecargadeconstrutores.

VALORPADRÃOPARAOSPARÂMETROS

NoC#, ao invés de fazermos sobrecarga de construtores para podermos passar informaçõesadicionaisnacriaçãodoobjeto,podemosutilizarosparâmetrosopcionaiscomvalorespadrão.

Você pode ler sobre os parâmetros opcionais no blog da caelum:http://blog.caelum.com.br/parametros-opcionais-e-nomeados-do-c/

.

Page 67: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

Vimosquepodemosutilizarumconstrutorparapedirinformaçõesobrigatóriasparaaclasse.Mas,por exemplo, temos a classe Cliente e apenas seu nome é obrigatório, então podemos pedir essainformaçãonoconstrutordaclasse.

Clientecliente=newCliente("VictorHarada");

Masocliente tambémpossuiCPF,RGe idade.Paracolocarmosessas informaçõesnoclientequecriamosprecisamosdocódigo:

Clientecliente=newCliente("VictorHarada");cliente.Cpf="123.456.789-01";cliente.Rg="21.345.987-x";cliente.Idade=25;

Vejaqueemtodasas linhasestamosrepetindoonomedavariávelqueguardaareferênciaparaocliente. Para evitar essa repetição, podemos utilizar os initializers doC#.O Initializer é um bloco decódigoqueserveparainicializaraspropriedadespúblicasdoobjeto.

Clientecliente=newCliente("VictorHarada"){//blocodeinicializaçãoCpf="123.456.789-01",Rg="21.345.987-x",Idade=25};

1. Ao modelar um sistema de controle de aviões em um aeroporto, todos os aviões possuem,obrigatoriamente,umcódigoeumaempresa,alémdisso,opcionalmente,umacidadedeentradaesaída.

Seuslivrosdetecnologiaparecemdoséculopassado?

8.2PARASABERMAIS—INITIALIZER

8.3EXERCÍCIOS

.

Page 68: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Qualsoluçãoparecesermaisfácildemanter?

Criarumconstrutorpara código e empresa, e quatropropriedades: código, empresa, cidadedeentradaedesaída.

Criarumconstrutorparacódigo,empresa,entradaesaídaenãocriarpropriedades.

Criarquatropropriedades:código,empresa,cidadedeentradaedesaída.

Criarumconstrutorparacódigoeempresa,eduaspropriedadescidadedeentradaedesaída.

2. QualdasopçõesaseguirrepresentaumconstrutordaclasseClientequerecebeonomeeorg?

classCliente

{//OutrosatributosdaclasseClientepublicstringNome{get;set;}publicstringRg{get;set;}publicCliente(stringnome,stringrg){this.Nome=nome;this.Rg=rg;}//Outrosmétodoseconstrutores}

classCliente

{//OutrosatributosdaclasseClientepublicstringNome{get;set;}publicstringRg{get;set;}publicCliente(stringnome){this.Nome=nome;this.Rg=rg;}//Outrosmétodoseconstrutores}

classCliente

{//OutrosatributosdaclasseClientepublicstringNome{get;set;}publicstringRg{get;set;}publicvoidCliente(stringnome,stringrg){this.Nome=nome;this.Rg=rg;}//Outrosmétodoseconstrutores}

classCliente

{//OutrosatributosdaclasseClientepublicstringNome{get;set;}publicstringRg{get;set;}publicintCliente(stringnome,stringrg)

.

Page 69: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{this.Nome=nome;this.Rg=rg;}//Outrosmétodoseconstrutores}

3. Façacomqueonomepossa,opcionalmente,serpassadonaconstruçãodaclasseCliente.

.

Page 70: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO9

Agora que já sabemos os conceitos básicos deOrientação aObjetos, chegou a hora de aprendermoscomoganhar produtividadeutilizandooVisual Studio para desenvolver uma interface gráfica para oprojetodobanco.Vamoscriarumnovoprojetoutilizandooatalho"Ctrl+Shift+N"doVisualStudio.Esse atalho abrirá a janela de novo projeto. Nessa janela escolheremos novamente o tipo "WindowsFormApp".Onomedessenovoprojetoserá"Banco".

Dentrodesseprojeto,queremoscolocarcamposdetextoparamostrarasinformaçõesdaconta,paraisso utilizaremos um novo componente do Windows form chamado TextBox. Colocaremos trêsTextBoxdentrodoformulário.

INTRODUÇÃOAOVISUALSTUDIOCOMWINDOWSFORM

.

Page 71: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

.

Page 72: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Paradefiniro textoque seráexibidonoTextBox, precisaremosdeumavariável que guardará areferência para o componenteTextBox. Para definir o nome dessa variável, devemos clicar com obotãodireitonoTextBoxeescolheraopçãoProperties

OVisualC#colocaráajanelaPropertiesemdestaque:

DentrodaProperties,procureocampo(Name).OnomequeforcolocadonessecamposeráonomedavariávelqueconteráareferênciaparaainstânciadeTextBox.Vamos,porexemplo,definirqueonomedocamposerátextoTitular.

PodemosutilizarareferênciaparaoTextBoxparadefinirotextoqueseráexibido:

textoTitular.Text="Textodaminhacaixadatexto";

VamoschamarosoutrosTextBoxdetextoNumeroetextoSaldo.Agoraprecisamosdefiniro

.

Page 73: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

códigodoformulárioqueseráutilizadoparapreencherasinformaçõesdoformulário.

Para fazer com que o formulário comece preenchido com a informação do titular da conta,precisamoscriarummétodono formulárioque será responsávelpor sua inicialização.Podemoscriaressemétododandoumduplocliquenoformulário:

privatevoidForm1_Load(objectsender,EventArgse){//carregueoscamposdeseuformulárioaqui}

Dentro desse método, queremos preencher as informações do formulário com os dados de umacontaqueseráinstanciada.Vamosinicialmenteinstanciaracontaqueserágerenciadapelaaplicação:

privatevoidForm1_Load(objectsender,EventArgse){Contac=newConta();}

Porém esse código gera um erro de compilação pois nesse projeto ainda não criamos a classeConta.FaremosoVisualStudiogeraradeclaraçãodessaclasse.ColoqueocursordotecladosobreonomedaclasseContaeaperteoatalhoCtrl+.,oVisualStudiodaráaopçãoGenerateclassfor'Conta':

Não precisamos nos preocupar em criar cada classe do projetomanualmente, podemos deixar opróprioVisualStudiofazerotrabalho!Mudeavisibilidadedaclassegeradaparapublic.

//ArquivoConta.cspublicclassConta{

}

Agora vamos voltar ao código do formulário e inicializar a propriedade Numero da conta da

9.1INTRODUÇÃOPRÁTICAAOSATALHOSDOVISUALSTUDIO

.

Page 74: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

variávelc:

privatevoidForm1_Load(objectsender,EventArgse){Contac=newConta();c.Numero=1;}

Ao adicionarmos essa linha, teremos novamente um erro de compilação, pois a conta ainda nãopossuiapropriedadeNumero.ColoqueocursorsobreapropriedadeNumero e apertenovamenteoCtrl + .. Dessa vez o visual studio mostrará a opçãoGenerate property stub for 'Numero' in'Banco.Conta',escolhaessaopção.

ComissoapropriedadeserácriadaautomaticamentedentrodaclasseConta.

publicclassConta{publicintNumero{get;set;}}

VamostambémdeclararapropriedadeSaldodentrodaConta,paraissoutilizaremosumnovoatalhodovisualstudio.AbaixodapropriedadeNumeroquefoideclaradaanteriormente,digitepropedepoisaperteateclatabduasvezes:

publicclassConta{publicintNumero{get;set;}

prop+<tab>+<tab>}

Esseéoatalhoparadeclararumanovapropriedadepúblicadentrodocódigo.

publicclassConta{publicintNumero{get;set;}

publicintMyProperty{get;set;}}

.

Page 75: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Vejaque,napropriedadecriadapelovisualstudio,otipodapropriedadeeseunomeestãomarcadoscom uma cor de fundo diferente porque ainda não falamos qual será o tipo e o nome da novapropriedade.Comoestamoscriandoapropriedadeparaosaldodaconta,colocaremosotipodouble.Depoisdedefinirotipodapropriedade,aperteateclatab,issomudaráofocodoeditorparaonomedapropriedade.DigiteonomeSaldo:

publicclassConta{publicintNumero{get;set;}

publicdoubleSaldo{get;set;}}

MasapenasacontapodealteraroSaldo,asoutrasclassesdevemconseguirfazerapenasaleitura.Porissomarcaremososetdapropriedadecomapalavraprivate.

publicdoubleSaldo{get;privateset;}

Damesma forma que criamos a propriedade com o atalho prop + <tab> + <tab>, tambémpodemoscriarumconstrutorparaaclasseutilizandooctor+<tab>+<tab>.

Paraterminaradeclaraçãodaspropriedadesdaconta,vamoscolocaroTitular.Volteàclassedoformulário principal da aplicação. Dentro do código da inicialização formulário, instancie um novoclientepassandoseunomecomoargumentodoconstrutor:

privatevoidForm1_Load(objectsender,EventArgse){Contac=newConta();c.Numero=1;Clientecliente=newCliente("victor");}

Isso novamente fará o Visual Studio apontar erros de compilação no código e, novamente,utilizaremosoCtrl+. para corrigir esse erro. Coloque o cursor do teclado sobre o tipo cliente,aperteCtrl+.eselecioneaopçãoGenerateclassfor'Cliente'.Modifiqueavisibilidadedaclassecriadaparapublicevoltenovamenteàclassedoformulário.

OcódigodoformulárioaindapossuioerrodecompilaçãoporqueaclasseClientequeacabamosdecriarnãopossuiumconstrutorquerecebeumastringcomoargumento.Entãovamosnovamentecolocarocursordotecladosobreoerrodecompilação,apertarCtrl+.eescolheraopçãoGenerateconstructorstubin'Banco.Cliente'.

.

Page 76: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

ComissocriamosautomaticamenteoconstrutordentrodaclasseCliente.

publicclassCliente{privatestringp;

publicCliente(stringp){this.p=p;}}

Vejaquenocódigodoconstrutorovalordoargumentopassadoéguardadodentrodeumatributoque foi declarado automaticamente, porém queremos guardar esse valor dentro de uma propriedadechamadaNomedoCliente.Apagueoatributoquefoicriadoautomaticamentepelovisualstudioedepoismodifiqueocódigodoconstrutorpara:

publicclassCliente{publicCliente(stringp){this.Nome=p;}}

Quandomodificarmosocódigo,oVisualStudioautomaticamentemostraráumerrodecompilaçãonaclasseClienteporqueapropriedadeNomeaindanãofoideclarada,entãovamoscriá-la.Dentrodocódigodoconstrutor,coloqueseucursorsobreapalavraNomeedepoisaperteCtrl+., escolha aopçãoGeneratepropertystubfor'Nome'in'Banco.Cliente'.Comisso,oVisualStudiocriaráautomaticamenteapropriedadeNomedentrodaclasseCliente:

publicclassCliente{publicCliente(stringp){this.Nome=p;}

publicstringNome{get;set;}}

Agoravoltandoaocódigodoformulário,precisamosguardaroclientequefoicriadonapropriedadeTitulardaConta:

privatevoidForm1_Load(objectsender,EventArgse){Contac=newConta();c.Numero=1;Clientecliente=newCliente("victor");c.Titular=cliente;}

Comessecódigotemosnovamenteumerrodecompilação,entãoutilizaremosoCtrl+. paracriarapropriedadeTitulardentrodaConta.

.

Page 77: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

Depois de criarmos a classeConta, precisamosmostrar seus dados nosTextBox's que foramadicionados.Comovimos,paracolocarotextoqueserámostradoemumTextBox,precisamosapenasescrevernapropriedadeText do objeto. Então paramostrarmos o nomedo titular, precisamos doseguintecódigo:

privatevoidForm1_Load(objectsender,EventArgse){Contac=newConta();//inicializaaContac

textoTitular.Text=c.Titular.Nome;}

No caso do número da conta, precisamos convertê-lo para umastring antes de escrevê-lo napropriedadeText.

Quando queremos fazer conversões entre os tipos básicos doC#, utilizamos uma classe chamadaConvertdoC#.Dentrodessaclasse,podemosutilizarométodoToStringparaconverterumtipoprimitivodalinguagemparaumastring.OcódigoparamostraraspropriedadesNumeroeSaldodacontaficadaseguinteforma:

textoNumero.Text=Convert.ToString(c.Numero);textoSaldo.Text=Convert.ToString(c.Saldo);

Agora vamos implementar botões no formulário quemanipulam a conta que está sendo exibida.Vamosinicialmenteimplementaraoperaçãodedepósito.Paraisso,arrasteparadentrodoformulárioumanovacaixadetextoefaçacomqueonomedavariáveldessacaixasejatextoValor.Alémdessacaixa,arrasteumnovobotãoparaoformulário.Quandoousuárioclicarnessebotão,ocódigodevelero

Agoraéamelhorhoradeaprenderalgonovo

9.2ACLASSECONVERT

9.3OPERAÇÕESNACONTA:SAQUEEDEPÓSITO

.

Page 78: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

valordigitadonacaixatextoValoreconvertê-loparaumdoublequeserápassadoparaométodoDeposita.

Dêumduplocliquenobotãoparaassociarumaaçãoemseueventodeclique.Dentrodaaçãodobotão,parapegarmosotextoquefoidigitadonotextoValor,precisamosapenaslerasuapropriedadeText:

privatevoidbutton1_Click(objectsender,EventArgse){stringvalorDigitado=textoValor.Text;}

AgoraprecisamosfazeraconversãodovalorDigitadoparaotipodoubledoC#.Pararealizaressaconversão,utilizaremosométodoToDoubledaclasseConvert:

privatevoidbutton1_Click(objectsender,EventArgse){stringvalorDigitado=textoValor.Text;doublevalorOperacao=Convert.ToDouble(valorDigitado);}

Eagoraquetemosovalordaoperaçãonotipocorreto,vamosutilizarométodoDepositadaclasseConta:

privatevoidbutton1_Click(objectsender,EventArgse){stringvalorDigitado=textoValor.Text;doublevalorOperacao=Convert.ToDouble(valorDigitado);c.Deposita(valorOperacao);}

Mas a ação desse botão não pode acessar uma variável que foi declarada dentro do métodoForm1_Load. Paraque amesma contapossa serutilizada emdiferentesmétodosdo formulário, elaprecisaserdeclaradacomoumatributodaclassedoformulárioquefoigeradapeloVisualStudio:

publicclassForm1:Form{privateContac;

//restodaclassedoformulário.}

DentrodoForm1_Load,guardaremosacontacriadadentrodonovoatributodoformulário:

privatevoidForm1_Load(objectsender,EventArgse){//Criaumanovacontaeguardasuareferêncianoatributodoformuláriothis.c=newConta();

//inicializaemostraacontanoformulário}

Comoacontaéumatributodoformulário,podemosacessá-laapartirdométodobutton1_Click.Mas ainda temosumerrode compilaçãoporqueométodoDeposita não existena classeConta.Entãovamoscriá-loutilizandooVisualStudio.Dentrodométodobutton1_Click,coloqueocursor

.

Page 79: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

dotecladosobreométodoDepositaeaperteCtrl+.,edepoisescolhaaopçãoGenerateMethodstubfor'Deposita'in'Banco.Conta'.

Comisso,oVisualStudioautomaticamentecolocaráométododentrodaclasseConta.

internalvoidDeposita(doublep){thrownewNotImplementedException();}

Apagueaimplementaçãopadrãodessemétodo,mudesuavisibilidadeparapublice,porfim,façaasuaimplementaçãoparaalógicadedepósito.Ocódigodeveficarparecidocomoquesegue:

publicvoidDeposita(doublevalorOperacao){this.Saldo+=valorOperacao;}

Para terminar a lógica de depósito, precisamos apenas atualizar o valor do saldo na interface dousuário. Abra novamente a ação do botão de depósito dentro do código do formulário principal daaplicação(métodobutton1_ClickdaclasseForm1).Dentrodessemétodo,vamosatualizarotextomostradonocampotextoSaldocomovalordosaldodaconta:

privatevoidbutton1_Click(objectsender,EventArgse){stringvalorDigitado=textoValor.Text;doublevalorOperacao=Convert.ToDouble(valorDigitado);this.c.Deposita(valorOperacao);textoSaldo.Text=Convert.ToString(this.c.Saldo);}

Para finalizarmos essa ação, podemos avisar o usuário que a operação foi realizada com sucessoutilizandoummessagebox.Colocaremosacaixademensagemutilizandooatalhombox+<tab>+<tab>,esseatalhodeclaraocódigodoMessageBox.Show:

privatevoidbutton1_Click(objectsender,EventArgse){stringvalorDigitado=textoValor.Text;doublevalorOperacao=Convert.ToDouble(valorDigitado);this.c.Deposita(valorOperacao);textoSaldo.Text=Convert.ToString(this.c.Saldo);MessageBox.Show("Sucesso");}

.

Page 80: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Comovimos,aaçãodeumbotãodoformulárioéummétododeclaradonaclassedoformulárioquecontém o botão. Vimos também que o Visual Studio gera o nome dos métodos na formabutton<numero>_Click.Esseéumnomequepodefacilmentecausarconfusãoegerarproblemasdemanutençãodocódigo.

EssenomegeradopeloVisualStudionaverdadeébaseadonapropriedade(Name)docomponenteButton . Então, para que o Visual Studio gere nomes mais amigáveis para os botões, podemossimplesmentemudaro(Name)dobotãonajanelaProperties.

Vamoscolocarumnovobotãono formulárioque implementaráaoperaçãode saque.Arrasteumnovobotãoparaoformulárioecomo(Name)dessebotãoutilizebotaoSaque.Agoradêumduplocliquenonovobotãoparagerarocódigodesuaaçãodeclique.IssocriaráumnovométodochamadobotaoSaque_Click:

privatevoidbotaoSaque_Click(objectsender,EventArgse){stringvalorDigitado=textoValor.Text;doublevalorOperacao=Convert.ToDouble(valorDigitado);this.c.Saca(valorOperacao);textoSaldo.Text=Convert.ToString(this.c.Saldo);MessageBox.Show("Sucesso");}

RestaapenasimplementarmosométodoSacadaConta:

publicvoidSaca(doublevalor){this.Saldo-=valor;}

Mude também o (Name) do botão de depósito para botaoDeposito . Na próxima seçãoaprenderemoscomorenomearonomedaaçãodobotãosemcausarproblemasdecompilação.

TEXTODOBOTÃO

O texto de um botão do Windows Form também pode ser customizado através de suapropriedadeText.EssapropriedadepodesermodificadanajanelapropertiesdoVisualStudio.

9.4CONTROLANDOONOMEDAAÇÃODEUMBOTÃO

.

Page 81: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

VamosolharocódigodoconstrutordoClientequeimplementamosanteriormente:

publicclassCliente{publicCliente(stringp){this.Nome=p;}}

Veja que nesse código estamos recebendo um parâmetro chamado p, mas o que esse nome psignifica?Quando criamos uma variável, é sempre importante utilizarmos nomes que descrevem suafunçãodentrodocódigo,senãopodemosacabardificultandoasualeituraecompreensãofuturas.

Masrenomearumavariávelexistenteéumatarefaárdua,poisnãoadiantaapenasrenomearmosadeclaraçãodavariável,precisamostambémmudartodosos lugaresqueautilizam.Quandoqueremosfazer uma renomeaçãode variáveis, podemosutilizar o próprio visual studio para fazer esse trabalhoatravésdoatalhoCtrl+R,Ctrl+R(Ctrl+Rduasvezes).

Vamos utilizar esse novo atalho para renomear o parâmetro p recebido no construtor doCliente.Paraisso,coloqueocursordotecladosobreadeclaraçãodoparâmetropousobreumdeseususosedepoisaperteCtrl+R,Ctrl+R. Issoabriráumanova janelaondepodemosdigitarqualéonovonomequequeremosutilizarparaessavariável.Digitenomenacaixadetextoedepoisconfirmeamudança.ComissooVisualStudiofaráorenameautomáticodavariáveldentrodocódigo.O mesmo atalho pode ser usado para renomearmos classes, métodos, atributos e propriedades docódigo.

Agorautilizaremosesseatalhoderenameparamodificaronomedaaçãodobotãodedepósitopara

EditoraCasadoCódigocomlivrosdeumaformadiferente

9.5RENOMEANDOVARIÁVEIS,MÉTODOSECLASSESCOMOVISUALSTUDIO

.

Page 82: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

botaoDeposito_Click.Coloqueocursordo tecladosobreonomedométodobutton1_Click daclasseForm1EaperteCtrl+R,Ctrl+RerenomeieométodoparabotaoDeposito_Click.

Podemostambémrenomearargumentodemétodosutilizandoesseatalho.AbraométodoSacadaclasseContaecoloqueocursordotecladosobreavariávelvalorOperacaoedepoisaperteoCtrl+R,Ctrl+R,mudeonomedavariávelparavalor.FaçaomesmocomométodoDeposita.

Noformulárioprincipal,acontaprincipaldaaplicaçãoestáutilizandoccomonomedevariável,porémcnãoéumbomnome,poiselenãoéumnomedescritivo.Tenteutilizaressenovoatalhoqueaprendemosparamudaronomedesseatributoparaconta,vejaqueoVisualStudiorenomearátantoadeclaraçãodoatributoquantoseususos.

Nestecapítuloconseguimosmostrarasinformaçõesdacontaatravésdainterfacedaaplicação,comissoousuárioconseguesaberoqueestáacontecendocomsuaconta,porémumacaracterísticamuitoimportantedeprogramascominterfacegráficaéaorganizaçãodasinformações.

Noformulárioquecriamos,comoousuáriosabequaissãooscamposquerepresentamosaldo,onúmero e o titular da conta?Precisamosde alguma formapara indicar qual é a informaçãoque estáarmazenadadentrodeumTextBox,paraissoutilizaremosumnovocomponentedoWindowsFormchamadoLabel.Olabel funciona comouma etiqueta para nossos campos de texto.Através dapropriedadeTextdaLabel,quepodesermodificadapelajanelaproperties,podemosdefinirqualéotextoqueseráexibido.Vejacomoficaaaplicaçãoquandoutilizamosolabel:

Mas e quando temos uma interface gráfica muito complexa? Nesses casos, podemos ter muitasfuncionalidadesouinformaçõesdentrodeumaúnicateladaaplicação.Paraessasituação,éumapráticacomum criar grupos de elementos com funcionalidades semelhantes. Para organizar os grupos decomponentes de um formulário, no Windows Form possuímos mais um componente chamadoGroupBox

9.6PARASABERMAIS—ORGANIZANDOOFORMULÁRIOCOMLABELEGROUPBOX

.

Page 83: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

UtilizandooGroupBox,podemosagrupardiversoscomponentesdiferentessobumúnicotítulo.Oformuláriodonossoprojeto,porexemplo,ficariadaseguinteforma:

ParafacilitaraconsultadosatalhosdoVisualStudio,nessaseçãovamoslistarosatalhosvistosnocapítulo:

Ctrl+Shift+N:criaumnovoprojetodentrodoVisualStudio;

Ctrl+ .:utilizadopara fazerconsertosrápidosnocódigo.Quandoestamosutilizandoumaclassequenãoexiste,eledeclaraaclassedentrodoprojeto.Aoutilizarmosumapropriedadeoumétodoinexistente,oatalhocriaautomaticamenteocódigoparaapropriedadeoumétodo;

9.7RESUMODOSATALHOSDOVISUALSTUDIO

.

Page 84: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Ctrl+R,Ctrl+R: renomeiaclasses,métodos,propriedades, atributosouvariáveisutilizadasnocódigo;

Ctrl+:autocomplete;

ctor++:declaraumconstrutordentrodaclasse;

prop++:declaraumapropriedadedentrodaclasse;

mbox++:declaraocódigodoMessageBox.Show().

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

1. Monteumformulárioquemostreoscampostitular,saldoenumerodeumaConta.Façacomqueavariável que guarda o campo titular seja chamada detextoTitular, a que guarda o saldo sejatextoSaldoeaqueguardaonumerosejatextoNumero.

Noloaddoformulário,escrevaumcódigoquecriaumacontacomtitularVictorenumero1.MostreosdadosdessacontanoscampostextoTitular,textoSaldoetextoNumerodoformulário.

2. Crieumnovocampode textonoformuláriochamadotextoValor.Adicione tambémumnovobotão que quando clicado executará a lógica de depósito utilizando o valor digitado no campocriado.Depoisdeexecutaralógica,atualizeosaldoatualqueéexibidopeloformulário.

3. Coloqueumnovobotãonoformulário.Façacomqueaaçãodocliquedessebotãoexecuteumsaquena contausandoo valordo campotextoValor.Apóso saque, atualize as informaçõesque sãoexibidasparaousuário.

JáconheceoscursosonlineAlura?

9.8EXERCÍCIOS

9.9PARASABERMAIS—TIPOSIMPLÍCITOSEAPALAVRAVAR

.

Page 85: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Umclienteprecisasermaiordeidadeouemancipadoparaabrirumacontanobanco.Alémdisso,ele também precisa de umCPF. Para verificar isso, o sistema possui ummétodo que verifica se umclientepodeounãoabrirumaconta:

publicboolPodeAbrirContaSozinho{get{return(this.idade>=18||this.documentos.contains("emancipacao"))&&!string.IsNullOrEmpty(this.cpf);}}

Percebaquepodemoscriartrêsvariáveisparaquenossoifnãofiquemuitocomplexo:

publicboolPodeAbrirContaSozinho{get{boolmaiorDeIdade=this.idade>=18;boolemancipado=this.documentos.contains("emancipacao");boolpossuiCPF=!string.IsNullOrEmpty(this.cpf);return(maiorDeIdade||emancipado)&&possuiCPF;}}

Desse jeito, o código ficamais limpo e fácil de entender. Porém, tivemos que ficar declarandoostiposdasvariáveiscomobool.NãoseriaóbvioparaoC#queessasvariáveissãodotipobool.Sim!Eeleéespertoosuficienteparainferirisso:

publicboolPodeAbrirContaSozinho{get{varmaiorDeIdade=this.idade>=18;varemancipado=this.documentos.contains("emancipacao");varpossuiCPF=!string.IsNullOrEmpty(this.cpf);return(maiorDeIdade||emancipado)&&possuiCPF;}}

Variáveisdentrodemétodos podem serdeclaradas comovar emC#queo seu tipo é inferidoautomaticamente.Paraocompiladoracertarqualotipodavariáveleladeveserinicializadanomesmoinstantequeédeclaradaenãopodeseratribuídoovalornull.

publicboolPodeAbrirContaSozinho{get{varmaiorDeIdade;//estalinhanãocompilamaiorDeIdade=this.idade>=18;//...}}

Porfim,umavariáveldeclaradacomovarpossuiumtipobemdefinidoenãopodeseralterado.A

.

Page 86: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

tipageméinferida,masotipodavariávelnãopodeseralteradaàmedidaqueocódigoéexecutado,oquefazcomqueocódigoseguintenãofaçasentidoenãocompile:

varguilherme=newCliente();guilherme=newConta();

1. Observeocódigoaseguireassinaleaalternativacorreta.

varconta=newConta();conta.Titular=newCliente();

Nãocompilapoisavariávelédeumtipodinâmico.

Compilaefazcomqueavariávelcontapossareferenciarqualquertipodeobjeto.

Nãocompilapoiselenãotemcomoadivinharsevaréumacontanovaoujáexistente.

CompilaefazcomqueavariávelcontasejadotipoConta.

2. Oqueaconteceaotentarcompilarerodarocódigoaseguir?

varsimples=newConta();//linha1simples=newConta();//linha2simples=newCliente();//linha3

Alinha2nãocompilapoisnãopodemosreatribuirumavariável.

Alinha3nãocompilapoisotipodeumavariávelnãopodesertrocadoeeleéinferidoaodeclararavariável.

Compilaenofimdas3linhasdecódigoavariávelsimplesapontaráparaumCliente.

Alinha1nãocompiladevidoaocódigodalinha2e3.

3. Oqueaconteceaocompilarerodarocódigoaseguir?

varconta;conta=newConta();conta.Deposita(300);

Nãocompilapoiscontanãoteveumvaloratribuídojánaprimeiralinha.

Compilamasnãoroda,dandoerrodeexecuçãonalinha2poistentamosacessarumavariávelsemvalor.

Compilaeroda.

4. Oqueaconteceaocompilareexecutarocódigoadiante?

vartamanho=5;tamanho=tamanho/2.0;

9.10EXERCÍCIOSOPCIONAIS

.

Page 87: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

MessageBox.Show(tamanho);

Ocódigonãocompilanalinha2.

Ocódigocompilaerodaimprimindo2.

Ocódigocompilamasnãorodapois5nãoédivisívelpor2.0.

Ocódigocompilaeroda,imprimindotamanho=2.5

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

.

Page 88: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO10

Imagineagoraquenossobancorealizedepósitosesaquesdeacordocomotipodaconta.Seacontaforpoupança,oclientedevepagar0.10porsaque.Seacontaforcorrente,nãohátaxa.

Paraimplementaressaregradenegócio,vamoscolocarumifnométodoSaca:

publicvoidSaca(doublevalor){if(this.Tipo==???????????){this.Saldo-=valor+0.10;}else{this.Saldo-=valor;}}

PodemoscriarumatributonaConta,queespecificaotipodacontacomo,porexemplo,uminteiroqualquerondeonúmero1representaria"contapoupança"e2"contacorrente".

Aimplementaçãoseriaalgocomo:

publicclassConta{publicintNumero{get;set;}publicdoubleSaldo{get;privateset;}

publicClienteTitular{get;set;}

publicintTipo{get;set;}

publicvoidSaca(doublevalor){if(this.Tipo==1){this.Saldo-=valor+0.10;}else{this.Saldo-=valor;}}

publicvoidDeposita(doublevalor){this.Saldo+=valor;}}

HERANÇA

.

Page 89: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Vejaqueumasimplesregradenegóciocomoessafeznossocódigocrescermuito.Epoderiaserpior:imaginesenossobancotivesse10tiposdecontasdiferentes.Esseifseriamaiorainda.

Precisamosencontrarumamaneiradefazercomqueacriaçãodenovostiposdecontanãoimpliqueemumaumentodecomplexidade.

UmasoluçãoseriaterclassesseparadasparaConta(queéacorrente)eContaPoupanca:

publicclassConta{publicintNumero{get;set;}publicdoubleSaldo{get;privateset;}

publicClienteTitular{get;set;}

publicvoidSaca(doublevalor){this.Saldo-=valor;}

publicvoidDeposita(doublevalor){this.Saldo+=valor;}}

publicclassContaPoupanca{publicintNumero{get;set;}publicdoubleSaldo{get;privateset;}

publicClienteTitular{get;set;}

publicvoidSaca(doublevalor){this.Saldo-=(valor+0.10);}

publicvoidDeposita(doublevalor){this.Saldo+=valor;}}

Ambasasclassespossuemcódigobemsimples,masagoraoproblemaéoutro:arepetiçãodecódigoentre ambas as classes. Se amanhã precisarmos guardar "CPF", por exemplo, precisaremosmexer emtodasasclassesquerepresentamumacontanosistema.Issopodesertrabalhoso.

Aideiaé,portanto,reaproveitarcódigo.Vejaque,nofim,umaContaPoupancaéumaConta,poisambostemNumero,SaldoeTitular.Aúnicadiferençaéocomportamentonomomentodosaque.PodemosfalarqueumaContaPoupancaéumaConta:

publicclassContaPoupanca:Conta

10.1REAPROVEITANDOCÓDIGOCOMAHERANÇA

.

Page 90: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{

}

Quandoumaclasseédefinidacomo:,dizemosqueelaherdadaoutra(Conta)eporissoelaganhatodososatributosemétodosdaoutraclasse.Porexemplo,seContaPoupancaherdardeConta,issoquerdizerqueelateráNumero,Saldo,Titular,Saca()eDeposita()automaticamente,semprecisar fazernada.DizemosqueaclasseContaPoupanca é uma subclasse ouclasse filha da classeContaequeContaéumaclassebaseouclassepaidaContaPoupanca.Vejaocódigoaseguir:

//ArquivoContaPoupanca.cspublicclassContaPoupanca:Conta{

}

//CódigonoformulárioqueutilizaaContaPoupancaContaPoupancac=newContaPoupanca();c.Deposita(100.0);

Bastausaranotação:eoC#automaticamenteherdaosmétodoseatributosdaclassepai.Masa ContaPoupanca tem o comportamento de Saca() diferente. Para isso, basta reescrever ocomportamentonaclassefilha,usandoapalavraoverrideemudandoaclassepaiparaindicarqueométodopodesersobrescrito(virtual):

//ArquivoConta.cspublicclassConta{publicvirtualvoidSaca(doublevalor){this.Saldo-=valor;}

//Restodocódigodaclasse}

//ArquivoContaPoupanca.cspublicclassContaPoupanca:Conta{publicoverridevoidSaca(doublevalor){this.Saldo-=(valor+0.10);}}

//CódigodoformuláriodaaplicaçãoContaPoupancac=newContaPoupanca();

//chamaocomportamentoescritonopai//OSaldoterminaem100.0depoisdessalinhac.Deposita(100.0);

//chamaocomportamentoescritonaContaPoupanca//OSaldoterminacomovalor49.90c.Saca(50);

VejanessecódigoqueinvocamostantoDeposita()quantoSaca().Nodepósito,comoaclasse

.

Page 91: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

filhanãoredefiniuocomportamento,ométodoescritonaclassepaiseráutilizado.

Jánosaque,ocomportamentousadoéoquefoisobrescritonaclassefilha.

Mas o código anterior ainda não compila. Repare que ométodo Saca() da ContaPoupancamanipula oSaldo.MasSaldo é privado! Atributos privados só são visíveis para a classe que osdeclarou.Osfilhosnãoenxergam.

Queremos proteger nosso atributomas não deixá-lo privado nem público. Queremos proteger osuficienteparaninguémdeforaacessar,masapenasquemherdateracesso.Pararesolver,alteraremosomodificador de acesso para protected. Atributos/métodos marcados como protected são visíveisapenasparaaprópriaclasseeparaasclassesfilhas:

publicclassConta{publicintNumero{get;set;}publicdoubleSaldo{get;protectedset;}

//...}

AclasseContaaindapodeserinstanciadasemproblemas:

Contac=newConta();c.Deposita(100.0);

Vejaquecomherançaconseguimossimplificarereutilizarcódigoaomesmotempo.Aherançaéummecanismopoderosomasdeveserutilizadocomcuidado.

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

ObserveasimplementaçõesdosmétodosSacadasclassesContaeContaPoupanca:

publicclassConta

JáconheceoscursosonlineAlura?

10.2REAPROVEITANDOAIMPLEMENTAÇÃODACLASSEBASE

.

Page 92: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{//outrosatributosemétodospublicdoubleSaldo{get;protectedset;}

publicvirtualvoidSaca(doublevalor){this.Saldo-=valor;}}

publicclassContaPoupanca:Conta{publicoverridevoidSaca(doublevalor){this.Saldo-=(valor+0.10);}}

Asimplementaçõesdosdoismétodossãopraticamenteiguais,aúnicadiferençaéquenoSacadaContaPoupanca colocamos this.Saldo -= (valor + 0.10); ao invés de this.Saldo -=

valor;.

Quando fazemos a sobrescrita de métodos em uma classe filha, muitas vezes, queremos apenasmudarlevementeocomportamentodaclassebase.Nessassituações,nocódigodaclassefilha,podemosreutilizar o código da classe pai com a palavra base chamando o comportamento que queremosreaproveitar.EntãoocódigodoSacadaContaPoupancapoderiaserreescritodaseguinteforma:

publicclassContaPoupanca:Conta{publicoverridevoidSaca(doublevalor){base.Saca(valor+0.10);}}

Comessaimplementação,oSacadaContaPoupancachamaométododaclassebasepassandocomo argumento valor + 0.10. Repare também que, como a classe filha não está utilizando apropriedadeSaldodaConta,elapoderiavoltaraserprivate:

publicclassConta{publicdoubleSaldo{get;privateset;}

//outraspropriedadesemétodos}

Nossobancotemrelatóriosinternosparasabercomoestáasaúdefinanceiradainstituição,alémderelatórios sobre os clientes e contas. Emumdeles, é necessário calcular a somado saldo de todas ascontas(correntes,poupanças,entreoutras)queexistemnobanco.Começandocom"zeroreais":

publicclassTotalizadorDeContas{

10.3POLIMORFISMO

.

Page 93: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicdoubleValorTotal{get;privateset;}}

PermitimosadicionarContaaonossorelatórioeacumularseusaldo:

publicclassTotalizadorDeContas{publicdoubleValorTotal{get;privateset;}

publicvoidSoma(Contaconta){ValorTotal+=conta.Saldo;}}

Contac1=newConta();Contac2=newConta();

TotalizadorDeContast=newTotalizadorDeContas();t.Soma(c1);t.Soma(c2);

Ótimo.Masoproblemaéquetemosclassesquerepresentamdiferentestiposdecontas,equeremosacumularosaldodelastambém.UmaprimeirasoluçãoseriaterummétodoSoma()paracadaclasseespecífica:

publicclassTotalizadorDeContas{publicdoubleValorTotal{get;privateset;}

publicvoidSoma(Contaconta){/*...*/}publicvoidSoma(ContaPoupancaconta){/*...*/}publicvoidSoma(ContaEstudanteconta){/*...*/}//maisummontedemétodosaqui!}

Novamentecaímosnoproblemadarepetiçãodecódigo.

VejaqueContaPoupancaéumaConta. Issoé inclusiveexpressoatravésda relaçãodeherançaentre as classes. E, já que ContaPoupanca é uma Conta , o C# permite que você passeContaPoupancaemlugaresqueaceitamreferênciasdotipoConta!Linguagensorientadasaobjetos,comoC#,possuemessasoluçãoelegantepraisso.

Vejaocódigoaseguir:

publicclassTotalizadorDeContas{publicdoubleValorTotal{get;privateset;}

publicvoidSoma(Contaconta){ValorTotal+=conta.Saldo;}}

Contac1=newConta();ContaPoupancac2=newContaPoupanca();

.

Page 94: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

TotalizadorDeContast=newTotalizadorDeContas();t.Soma(c1);t.Soma(c2);//funciona!

Ocódigofunciona!Podemospassarc2aliparaométodoSoma().

Mascomo isso funciona?OC#sabequeContaPoupancaherda todososatributosemétodosdeConta, e portanto, tem a certeza de que existe o atributoSaldo, e que ele poderá invocá-lo semmaioresproblemas!

Agora,umaContaPoupancatemumnovocomportamento,quepermitecalcularseusrendimentos.ParaissoodesenvolvedorcriouumcomportamentochamadoCalculaRendimento():

classContaPoupanca:Conta{publicvoidCalculaRendimento(){//...}}

VejaométodoSoma().EleinvocatambémoCalculaRendimento():

publicclassTotalizadorDeContas{publicdoubleValorTotal{get;privateset;}

publicvoidSoma(Contaconta){ValorTotal+=conta.Saldo;conta.CalculaRendimento();//nãocompila!}}

O código anterior não compila. Por quê? Porque o C# não consegue garantir que o que virá navariávelcontaseráumaContaPoupanca.Naquela"porta"entraContaouqualquerfilhodeConta.Portanto,tudooqueoC#conseguegarantiréqueoobjetoqueentraralitemtudoqueContatem.Porisso,sópodemosusarmétodoseatributosdefinidospelotipodavariável(nocaso,Conta.)

Essaideiadeumavariavelconseguirreferenciarseuprópriotipooufilhosdessetipoéconhecidoporpolimorfismo.Vejaque,comousodepolimorfismo,garantimosqueaclasseTotalizadorDeContasfuncionaráparatodonovotipodeContaqueaparecer.

Seno futuroumnovo tipode conta, comoconta investimento, for criada,bastaque elaherdedeContaenãoprecisaremosnuncamodificaressaclasse!Elafuncionaránaturalmente!

Um programador que conhece bem orientação a objetos faz uso constante de polimorfismo.Veremos mais pra frente como continuar usando polimorfismo para escrever código de qualidade,tomandocuidadoparanãoabusardessaideia.

10.4EXERCÍCIOS

.

Page 95: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

1. Qualadiferençaentreprivateeprotected?

Nenhuma.Emambos,oatributo/métodoévisívelparatodos.

Só a própria classe enxerga atributos/métodos private enquanto protected é visto pelaprópriaclassemaisasclassesfilhas.

Só a própria classe enxerga atributos/métodos protected enquanto private é visto pelaprópriaclassemaisasclassesfilhas.

2. Paraqueserveapalavraoverride?

Paraindicarqueométodoestásobrescrevendoummétododaclassepai.

Paranãopermitiracessoaoatributoporoutrasclasses.

Paraindicarqueessemétodonãodeveserutilizado.

3. Praqueserveapalavravirtual?

Parapermitirqueométodosejasobrescrito.

Paraindicarqueessemétodonãodevesersobrescrito.

Parasobrescreverummétododaclassepai.

Paranãopermitiracessoaoatributoporoutrasclasses.

4. AdicioneaclasseContaPoupancanaaplicação.EssaclassedeveherdardaContaesobrescreverocomportamentodométodoSacaparaquetodosossaquesrealizadosnacontapoupançapaguemumataxadeR$0.10.

Nãoseesqueçadeutilizaraspalavrasvirtualeoverrideparasobrescreverosmétodos.

5. Oqueaconteceaoexecutarmosocódigoaseguir:

Contac1=newContaPoupanca();c1.Deposita(100.0);c1.Saca(50.0);MessageBox.Show("contapoupança="+c1.Saldo);

Contac2=newConta();c2.Deposita(100.0);c2.Saca(50.0);MessageBox.Show("conta="+c2.Saldo);

contapoupanca=49.9econta=49.9

contapoupança=49.9econta=50.0

contapoupança=50.0econta=50.0

.

Page 96: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

contapoupança=50.0econta=49.9

6. FaçacomqueométodoForm1_Load,instancieumaContaPoupancaaoinvésdaConta:

publicpartialclassForm1:Form{//EssaéamesmadeclaraçãoquecolocamosnocapítuloanteriorprivateContaconta;privatevoidForm1_Load(objectsender,EventArgse){this.conta=newContaPoupanca();//restodocódigocontinuaigual}

//códigodorestodoformuláriotambémcontinuaigual}

Reparequenãoprecisamosmodificarotipodavariávelconta,poiscomoaContaPoupancaherdadeConta,podemosutilizaropolimorfismoparaatribuirumareferênciadotipoContaPoupancaemumavariáveldotipoConta.

Depois demodificar o programa, execute-o e teste a operação de depósito. Repare que na classeContaPoupancanãodeclaramosométodoDeposita,masmesmoassimconseguimosinvocá-lodentrodocódigo,issoépossívelpoisquandoutilizamosherança,todoocomportamentodaclassepaiéherdadopelaclassefilha.

Testetambémobotãodesaque.ComoaContaPoupancasobrescreveométodoSacadaConta,ao apertarmos o botão de saque, estamos invocando o comportamento especializado que foiimplementadonaContaPoupancaaoinvésdeusaroquefoiherdadodaConta.

7. CrieaclasseContaCorrentedentrodoprojetoefaçacomqueelaherdedaclasseConta.

TodasasoperaçõesnaContaCorrenteserãotarifadas,emtodoSaque,precisamospagarumataxadeR$ 0.05 e para os depósitos, R$ 0.10, ou seja, naContaCorrente, precisaremos sobrescrevertantoométodoSacaquantooDeposita.Nãoseesqueçadeusarovirtualeoverrideparafazerasobrescritanocódigo.

Depois de criar a ContaCorrente, modifique novamente o formulário para que ele mostre asinformaçõesdeumaContaCorrenteaoinvésdeumaContaPoupanca.

8. (Opcional) Implemente a classe TotalizadorDeContas com uma propriedade chamadaSaldoTotaleummétodochamadoAdicionaquedevereceberumacontaesomarseusaldoaosaldototaldototalizador.Escrevaumcódigoquetestaototalizador.

PodemospassarumainstânciadeContaCorrenteparaoAdicionadototalizador?Porquê?

.

Page 97: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

Nestecapítulo,vimosquequandofazemosaclasseContaPoupancaherdardaclasseConta, elarecebeautomaticamentetodososatributos,propriedadesemétodosdaclassepai,porémosconstrutoresdaclassepainãosãoherdados.Entãoseaclassefilhaprecisadeumconstrutorqueestánaclassepai,eladeveexplicitamentedeclararesseconstrutoremseucódigo.

Imagineporexemplo,queparaconstruirmosacontaprecisamospassaropcionalmenteseunúmero:

publicclassConta{publicintNumero{get;set;}//ConstrutorsemargumentospublicConta(){}

publicConta(intnumero){this.Numero=numero;}}

Agora na classe ContaPoupanca queremos passar o número na construção do objeto, como oconstrutornãoéherdado,precisamoscolocaradeclaraçãoexplicitamente:

publicclassContaPoupanca:Conta{publicContaPoupanca(intnumero){//ApropriedadeNumeroveioherdadadaclasseContathis.Numero=numero;}}

Nesse construtor que acabamos de declarar na classe ContaPoupanca , fizemos apenas ainicializaçãodapropriedadenúmero, exatamenteomesmocódigoque temosno construtorda classepai, então ao invés de repetirmos o código, podemos simplesmente chamar o construtor que foi

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

10.5PARASABERMAIS—OQUEÉHERDADO?

.

Page 98: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

declaradonaclasseContaapartirdoconstrutordaclasseContaPoupancautilizandoapalavrabase:

publicclassContaPoupanca:Conta{//Estamoschamandooconstrutordaclassepaiquejáfazainicialização//donúmeroeporissoocorpodoconstrutorpodeficarvazio.publicContaPoupanca(intnumero):base(numero){}}

Naverdade,dentrodoC#,semprequeconstruímosumainstânciadeContaPoupanca,oC#sempreprecisachamarumconstrutordaclasseContapara fazera inicializaçãodaclassebase.Quandonãoinvocamosexplicitamenteoconstrutordaclassepai,oC#colocaimplicitamenteumachamadaparaoconstrutorsemargumentosdaclassepai:

publicclassContaPoupanca:Conta{//nessecódigooc#chamaráoconstrutorsemargumentosdaclasseConta.publicContaPoupanca(intnumero){this.Numero=numero;}}

SeaclasseContanãodefiniroconstrutorsemargumentos,temosumerrodecompilaçãosenãoinvocarmosexplicitamenteumconstrutordaclassepai.

.

Page 99: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO11

Queremosguardaruma listade contasdenossobancoparapoder trabalhar comelas.Umaprimeiraalternativa seria criar um conjunto de variáveis, no qual cada variável aponta para uma Contadiferente:

Contac1=newConta();Contac2=newContaPoupanca();Contac3=newConta();//...

Mas,esequisermosimprimirosaldodetodaselas?PrecisaremosescreverNlinhas,umaparacadaConta:

MessageBox.Show(c1.Titular.Nome);MessageBox.Show(c2.Titular.Nome);MessageBox.Show(c3.Titular.Nome);

Muitotrabalho!CriarumanovaContaseriaumcaos!

Quando queremos guardar diversos objetos, podemos fazer uso de Arrays. Um array é umaestruturadedadosqueconsegueguardarvárioselementoseaindanospossibilitapegaresseselementosdemaneirafácil!

Criarumarrayémuitoparecidocominstanciarumaclasse.Paracriarmos5posiçõesdenúmerosinteiros:

int[]numeros=newint[5];

Acabamosdedeclararumarraydeinteiros,com5posições.Repareanotação[5]. Para guardarelementosnessasposições,fazemos:

numeros[0]=1;numeros[1]=600;numeros[2]=257;numeros[3]=12;numeros[4]=42;MessageBox.Show("número="+numeros[1]);

Vejaqueaprimeiraposiçãodeumarrayé0(zero).Logo,asposiçõesdeumarrayvãode0(zero)até(tamanho-1).

VamosagoracriarumarraydeContas:

Conta[]contas=newConta[5];

TRABALHANDOCOMARRAYS

.

Page 100: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

contas[0]=newConta();

A sintaxe é a mesma. Os elementos guardados pelo array são iguais aos de uma variávelconvencional,quevocêjáestáacostumado.Issoquerdizerquetemospolimorfismotambém!Ouseja,podemosguardar,emumarraydeConta,qualquerfilhodela:

contas[1]=newContaPoupanca();

Sequisermos imprimir todasasContasarmazenadas,podemos fazerum loopnessearray.O loopcomeçaráem0evaiatéotamanhodoarray(contas.Length):

for(inti=0;i<contas.Length;i++){MessageBox.Show("saldo="+contas[i].Saldo);}

PodemosaindausarumaoutrasintaxedoC#,afinalqueremosirparacadaContacemcontas:

foreach(Contacincontas){MessageBox.Show("saldo="+c.Saldo);}

OC#pegacadaelementodoarrayecolocaautomaticamentenavariávelc,imprimindooresultadoquequeremos.

Emmuitassituações,estamosinteressadosemcriarelogoemseguidainicializaroconteúdodeumarray,paraisso,comovimosnessecapítulo,precisaríamosdeumcódigoparecidocomoquesegue:

int[]inteiros=newint[5];inteiros[0]=1;inteiros[1]=2;inteiros[2]=3;inteiros[3]=4;inteiros[4]=5;

Veja que esse código é repetitivo e fácil de ser escrito de forma incorreta. Para facilitar nossotrabalho,oC#nosofereceumatalhoparacriar e inicializaroconteúdodoarray.Sequiséssemosumarraydeinteirospreenchidocomosnúmerosde1a5,poderíamosutilizaroseguintecódigo:

int[]umAoCinco=newint[]{1,2,3,4,5};

Essasintaxepodeserutilizadaemarraysdequalquertipo.

11.1PARASABERMAIS—INICIALIZAÇÃODEARRAYS

.

Page 101: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

1. Qualdaslinhasaseguirinstanciaumarrayde10elementos?

int[]numeros=newint[9];

int[]numeros=newint[10];

int[]numeros=newint["dez"];

int[10]numeros=newint[10];

2. Imagineoarrayabaixo:

int[]numeros=newint[15];

Comoacessaroquintoelementonessalista?

numeros[3]

numeros[4]

numeros["quinto"]

numeros[5]

3. Dadoumarraynumero,comodescobrirseutamanho?

numero.Length

numero.Size

numero.Size()

Seuslivrosdetecnologiaparecemdoséculopassado?

11.2EXERCÍCIOS

.

Page 102: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

numero.Length()

numero.Capacity()

4. Agoravamosutilizararraysnoprojetodobancoparatrabalharmoscomdiversascontasaomesmotempo. Dentro da classe do formulário da aplicação, a classe Form1 criada pelo Visual Studio,vamosguardarumarraydecontasaoinvésdeumaúnicaconta.

publicpartialclassForm1:Form{//vamossubstituircontaporumarraydecontas.//Apaguealinha://privateContaconta;//Ecoloqueadeclaraçãodoarrayemseulugar:privateConta[]contas;

//restodaclasse}

NométodoForm1_Load,vamosinicializaroarraydecontasdoformulárioe,aoinvésdecriarmosumaúnicaconta,vamoscriardiversascontaseguardá-lasdentrodoarray.

privatevoidForm1_Load(objectsender,EventArgse){//criandooarrayparaguardarascontascontas=newConta[3];

//vamosinicializaralgumasinstânciasdeConta.this.contas[0]=newConta();this.contas[0].Titular=newCliente("victor");this.contas[0].Numero=1;

this.contas[1]=newContaPoupanca();this.contas[1].Titular=newCliente("mauricio");this.contas[1].Numero=2;

this.contas[2]=newContaCorrente();this.contas[2].Titular=newCliente("osni");this.contas[2].Numero=3;}

Noformulário,parasabermosqualéacontaquedeveserexibida,colocaremosumnovocampodetextoondeousuárioescolheráqualéoíndicedaContaqueseráutilizada.ChameessecampodetextodetextoIndice.Alémdo campode texto, adicione tambémumnovobotãoquequandoclicadomostraráacontadoíndicequeousuárioselecionou.

Oseuformuláriodeveficarparecidocomodaimagem:

.

Page 103: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

UtilizebotaoBuscacomo(Name)dessenovobotão.

QuandoousuárioclicarnobotaoBusca,precisamosmostraracontaquefoiselecionada:

privatevoidbotaoBusca_Click(objectsender,EventArgse){intindice=Convert.ToInt32(textoIndice.Text);Contaselecionada=this.contas[indice];textoNumero.Text=Convert.ToString(selecionada.Numero);textoTitular.Text=selecionada.Titular.Nome;textoSaldo.Text=Convert.ToString(selecionada.Saldo);}

No botão de depósito, precisamos depositar o valor na conta que foi escolhida pelo usuário notextoIndice.Emnossoexemplo,seousuáriodigitar1notextoIndice,precisamos fazerodepósitonacontadotitularmauricio(queestánaposição1doarray).

privatevoidbotaoDeposito_Click(objectsender,EventArgse){//primeiroprecisamosrecuperaroíndicedacontaselecionadaintindice=Convert.ToInt32(textoIndice.Text);

//edepoisprecisamosleraposiçãocorretadoarray.Contaselecionada=this.contas[indice];

doublevalor=Convert.ToDouble(textoValor.Text);selecionada.Deposita(valor);textoSaldo.Text=Convert.ToString(selecionada.Saldo);}

FaçaomesmoparaaaçãodobotãodeSaque.Depoisdefazertodasasmodificações,testeaaplicaçãofazendo,porexemplo,umdepósitonacontaqueestánoíndice0.

Tentefazeroperaçõesemdiferentestiposdeconta.Vejaquedependendodotipodecontaquefoicadastradanoarray,teremosumresultadodiferenteparaasoperaçõesdesaqueedepósito.Notequeo código do formulário não precisa conhecer as contas que estão gravadas no array, ele precisa

.

Page 104: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

apenasutilizarosmétodosqueestãonainterfacedeusodaconta.

Naaplicação,estamosgerenciandoascontascadastradasatravésdeumcampodetexto.Essaéumaabordagembemsimples,masquepossuidiversosproblemas:

Ocódigoesperaqueousuáriodigiteumnúmeronocampode texto.Seeledigitaruma letraouqualqueroutrocaracterenãonumérico,teremosumerro;Onúmerodigitadodeveserumíndiceválidodoarrayounovamenteteremosumerronocódigo.

Seria muito melhor se o usuário pudesse escolher uma conta cadastrada a partir de uma listagerenciada pela aplicação. Para implementarmos essa ideia, vamos utilizar um novo componente doWindowsFormchamadoComboBox.

Paraadicionarumcomboboxnoformulário,precisamosapenasabrirajanelaToolbox(Ctrl+W,X)earrastarocomboboxparadentrodoformulário.

Para inserir os elementos que serão exibidos no combo box, precisaremos de uma variável queguardaareferênciaparaocomponente.Assimcomonocampodetexto,podemosdefinironomedessavariávelatravésdajanelaproperties.

Paraacessarajanelapropertiesdocombobox,cliquecomobotãodireitodomousenocomboboxeselecioneaopçãoProperties.

Dentrodajanelaproperties,utilizaremosnovamenteocampo(Name)paradefinironomedavariávelqueguardaráareferênciaparaocombobox.VamosutilizarcomboContas.

Agoraprecisamosmostrarostitularesdascontascomoitensdocombobox.Paraadicionarumnovoitemnocombobox,utilizamososeguintecódigo:

comboContas.Items.Add("Textoqueapareceránocombobox");

11.3ORGANIZANDOASCONTASCOMOCOMBOBOX

.

Page 105: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Logo,paramostrarostitularescomoitensdocombobox,utilizamososeguintecódigo;

comboContas.Items.Add(contas[0].Titular.Nome);comboContas.Items.Add(contas[1].Titular.Nome);

Oupodemosutilizarumforeach:

foreach(Contacontaincontas){comboContas.Items.Add(conta.Titular.Nome);}

Agoraquejáconseguimosmostrarocombobox,queremosqueaescolhadeumaopçãonocombo,façacomqueoformuláriomostreacontadotitularselecionado.

Para associar uma ação ao evento demudança de seleção do combo, precisamos apenas dar umduplocliquenocombobox.IssocriaráumnovométodonaclasseForm1:

privatevoidcomboContas_SelectedIndexChanged(objectsender,EventArgse){

}

Podemosrecuperarqualéo índice(começandodezero)do itemque foi selecionadopelousuáriolendoapropriedadeSelectedIndexdocomboContas:

intindice=comboContas.SelectedIndex;

Esseíndicerepresentaqualéoelementodoarraydecontasquefoiselecionado,logo,podemosusá-lopararecuperaracontaquefoiescolhida:

Contaselecionada=contas[indice];

Depoisdedescobrirqualéacontaescolhida,vamosmostrá-lanoformulário:

textoTitular.Text=selecionada.Titular.Nome;textoSaldo.Text=Convert.ToString(selecionada.Saldo);textoNumero.Text=Convert.ToString(selecionada.Numero);

OcódigocompletodocomboContas_SelectedIndexChangedficadaseguinteforma:

.

Page 106: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

privatevoidcomboContas_SelectedIndexChanged(objectsender,EventArgse){intindice=comboContas.SelectedIndex;Contaselecionada=contas[indice];textoTitular.Text=selecionada.Titular.Nome;textoSaldo.Text=Convert.ToString(selecionada.Saldo);textoNumero.Text=Convert.ToString(selecionada.Numero);}

1. Vamossubstituirocampodetextoqueselecionaacontaparaasoperaçõesporumcombobox.Noformulário da aplicação apague o campo textoIndice , o botaoBusca e o métodobotaoBusca_Click.Essesdoiscomponentesserãosubstituídospelocombobox.

Agora abra a janelaToolbox doVisual Studio e arraste umComboBox para a aplicação.ChamecomponentedecomboContas.Seuformuláriodeveficarcomooaseguir:

Naaçãodecarregamentodoformulário,vamoscadastrarascontasdoarraydentrodocombobox.Paraisso,precisamoschamarométodoAdddapropriedadeItemsdocomboContas passandoqualéotextoquequeremosmostrarcomoopçãodocombobox.

privatevoidForm1_Load(objectsender,EventArgse){//códigodeinicializaçãodoarraydecontas

foreach(Contacontaincontas){comboContas.Items.Add("titular:"+conta.Titular.Nome);}}

Quando o usuário modificar o valor do combo box, queremos mudar a conta que é exibida noformulário. Para criarmos ométodo que cuidará do evento demudança de item selecionado do

11.4EXERCÍCIOS

.

Page 107: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

combo box, dê um duplo clique no componente. Isso criará dentro do Form1 o métodocomboContas_SelectedIndexChanged:

privatevoidcomboContas_SelectedIndexChanged(objectsender,EventArgse){intindice=comboContas.SelectedIndex;Contaselecionada=this.contas[indice];textoNumero.Text=Convert.ToString(selecionada.Numero);textoTitular.Text=selecionada.Titular.Nome;textoSaldo.Text=Convert.ToString(selecionada.Saldo);}

Agora faça com que os botões Depositar e Sacar (métodos botaoDeposito_Click ebotaoSaque_Click,respectivamente)operemnacontaselecionadapelocombobox.

2. (Opcional) Vamos agora adicionar a lógica de transferência no formulário. Adicione um novocomboboxnoformuláriochamadocomboDestinoTransferenciaeumnovobotãoque,quandoclicado, transfere dinheiro da conta selecionada no comboContas para a conta selecionada nocomboDestinoTransferencia.

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

Agoraéamelhorhoradeaprenderalgonovo

.

Page 108: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO12

Atéagora,temosemnossaaplicaçãoumcaixaeletrônicocomumnúmerofixodecontas,nessecapítulo,vamosfazerumnovoformulárioparacadastrarascontasnocaixaeletrônico.

Paranãocolocarmosaindamaiscamposnoformulárioprincipal,vamoscriarumnovoformulárionoprojeto.AbraoSolutionExplorer,cliquecomobotãodireitonoprojetoBancoeselecioneAdd>NewItem.

Nanovajanela,selecioneaopçãoWindowsForm ecoloqueFormCadastroConta.cs no campoName.Emseguida,cliquenobotãoAdd.

CADASTRODENOVASCONTAS

.

Page 109: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Agora que terminamos de criar o novo formulário, vamos adicionar um campo de texto para otitulardaconta(chamadotextoTitular)eumparaonúmerodaconta(chamadotextoNumero).Alémdessescampos,precisaremos tambémdeumbotãoque,quandoclicado, realizaráocadastrodanovaconta.Adicioneobotãoechame-odebotaoCadastro

Vamosdefiniraaçãodobotãodecadastrodessenovoformulário.Dêumduplocliquenobotãoqueacabamosdecriar.IssoabriránovamenteoeditordoVisualStudio:

publicpartialclassFormCadastroConta:Form{publicFormCadastroConta(){InitializeComponent();}

privatevoidbotaoCadastro_Click(objectsender,EventArgse){

}

.

Page 110: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}

Naaçãodobotão,queremoscriarumanova instânciadeconta,ContaCorrente por exemplo, edepoispreencherosseusdados:

privatevoidbotaoCadastro_Click(objectsender,EventArgse){ContanovaConta=newContaCorrente();novaConta.Titular=newCliente(textoTitular.Text);novaConta.Numero=Convert.ToInt32(textoNumero.Text);}

Agora que inicializamos a conta, precisamos cadastrá-la no array que está na classe Form1 .Precisamos, portanto, acessar a instância de Form1 a partir de FormCadastroConta. Queremosgarantirque,naconstruçãodoFormCadastroConta,teremosainstânciadeForm1,portantovamosmodificaroconstrutordaclasseparareceberoformulárioprincipal:

publicpartialclassFormCadastroConta:Form{privateForm1formPrincipal;

publicFormCadastroConta(Form1formPrincipal){this.formPrincipal=formPrincipal;InitializeComponent();}

//Açãodecadastrodeconta}

Precisamos colocar a conta criada no array que contém todas as contas cadastradas que está noformulárioprincipaldaaplicação.

Parafazerisso,podemosmudaravisibilidadedoatributo(deixarocontaspúblico),masissoéumaviolaçãodeencapsulamento,estamosclaramentevendoosdetalhesdeimplementaçãodaclasseForm1.Portanto, precisamos colocar ummétodoque adicionaumanova contana interface deusoda classeForm1.

publicpartialclassForm1{//Esseéomesmoarrayquecolocamosnocapítulodearrays.privateConta[]contas;

//outrosmétodosdeForm1

publicvoidAdicionaConta(Contaconta){//implementaçãodométodoadicionaconta}}

Inicialmente,temoszerocontascadastradasnosistemaeaprimeiracontaserácolocadanaposiçãozero, no cadastro da segunda, temos 1 conta já cadastrada e a próxima será colocada na posição 1.Repare que sempre colocamos a conta na posição equivalente ao número de contas que já estãocadastradas. Então para implementarmos oAdicionaConta, precisaremos de um novo atributo noformulárioquerepresentaonúmerodecontasquejáforamcadastradas.

.

Page 111: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicpartialclassForm1{privateConta[]contas;//guardaonúmerodecontasquejáforamcadastradasprivateintnumeroDeContas;

//outrosmétodosdeForm1

publicvoidAdicionaConta(Contaconta){this.contas[this.numeroDeContas]=conta;this.numeroDeContas++;}}

Alémdecolocaracontanoarray,precisamostambémregistraracontanocomboContas.

publicvoidAdicionaConta(Contaconta){this.contas[this.numeroDeContas]=conta;this.numeroDeContas++;comboContas.Items.Add("titular:"+conta.Titular.Nome);}

Precisamosutilizaressenovométododentrodoformuláriodecadastroparacadastraranovaconta:

privatevoidbotaoCadastro_Click(objectsender,EventArgse){ContanovaConta=newContaCorrente();novaConta.Titular=newCliente(textoTitular.Text);novaConta.Numero=Convert.ToInt32(textoNumero.Text);

this.formPrincipal.AdicionaConta(novaConta);}

Agoraquetemostodaalógicapronta,precisamosapenascolocarumbotãonoformulárioprincipalqueabreoformuláriodecadastrodenovaconta.Chamá-lo-emosdebotaoNovaConta:

Na ação desse botão, precisamos instanciar o FormCadastroConta passando a instância do

.

Page 112: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

formulário principal. Dê um duplo clique no botão que acabamos de incluir no formulário paraimplementarsuaação:

privatevoidbotaoNovaConta_Click(objectsender,EventArgse){//thisrepresentaainstânciadeForm1queestásendoutilizadapelo//WindowsFormFormCadastroContaformularioDeCadastro=newFormCadastroConta(this);}

Paramostraroformulário,utilizaremosométodoShowDialogdoFormCadastroConta

privatevoidbotaoNovaConta_Click(objectsender,EventArgse){FormCadastroContaformularioDeCadastro=newFormCadastroConta(this);formularioDeCadastro.ShowDialog();}

Comissoterminamosocadastrodenovascontasnaaplicação.

TemososeguintecódigonométodoqueéexecutadonoLoaddoformulárioprincipal:

privatevoidForm1_Load(objectsender,EventArgse){this.contas=newConta[3];

//vamosinicializaralgumasinstânciasdeConta.this.contas[0]=newConta();this.contas[0].Titular=newCliente("victor");this.contas[0].Numero=1;

this.contas[1]=newContaPoupanca();this.contas[1].Titular=newCliente("mauricio");this.contas[1].Numero=2;

this.contas[2]=newContaCorrente();this.contas[2].Titular=newCliente("osni");this.contas[2].Numero=3;

foreach(Contacontaincontas){comboContas.Items.Add(c.Titular.Nome);}}

Veja que estamos colocando as contas diretamentena posição correta do array,masnão estamosatualizando o atributo numeroDeContas que incluímos no formulário. Além disso, inicializamos oarraycomapenas3posições,logonãotemosmaisespaçoparacadastrarasnovascontas.

Para resolvero segundoproblema,precisamos simplesmentemodificaro tamanhodoarrayqueéalocadopara,porexemplo,aceitaratédezcontas:

privatevoidForm1_Load(objectsender,EventArgse){

12.1UTILIZANDOOADICIONACONTANOLOADDOFORMULÁRIO

.

Page 113: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

this.contas=newConta[10];

//restodocódigodométodo}

Pararesolveroprimeiroproblema,odeatualizarovalordoatributonumeroDeContas,precisamosapenasdeumincrementodepoisdeadicionarcadaumadascontasnoarray:

privatevoidForm1_Load(objectsender,EventArgse){this.contas=newConta[10];

//vamosinicializaralgumasinstânciasdeConta.this.contas[0]=newConta();this.contas[0].Titular=newCliente("victor");this.contas[0].Numero=1;this.numeroDeContas++;

this.contas[1]=newContaPoupanca();this.contas[1].Titular=newCliente("mauricio");this.contas[1].Numero=2;this.numeroDeContas++;

this.contas[2]=newContaCorrente();this.contas[2].Titular=newCliente("osni");this.contas[2].Numero=3;this.numeroDeContas++;

foreach(Contacontaincontas){comboContas.Items.Add(c.Titular.Nome);}}

Vejaquenocódigodométodoestamoscadastrandoacontanoarray,incrementandoonúmerodecontase,porfim,adicionandoacontanocomboContas.EssecódigofazexatamenteomesmotrabalhoqueométodoAdicionaContaquecriamosnessecapítulo.Então,podemosreutilizá-lo:

privatevoidForm1_Load(objectsender,EventArgse){this.contas=newConta[10];

//vamosinicializaralgumasinstânciasdeConta.Contac1=newConta();c1.Titular=newCliente("victor")c1.Numero=1;this.AdicionaConta(c1);

Contac2=newContaPoupanca();c2.Titular=newCliente("mauricio");c2.Numero=2;this.AdicionaConta(c2);

Contac3=newContaCorrente();c3.Titular=newCliente("osni");c3.Numero=3;this.AdicionaConta(c3);}

ReparequecomessecódigoométodoForm1_Loadnãoprecisamaissepreocuparcomosdetalhes

.

Page 114: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

de comoas contas são armazenadas enemde comoadicionar a contanocomboContas.Todo esseconhecimentoficaencapsuladonométodoAdicionaConta.

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

1. Vamos criar um novo formulário que será responsável por fazer o cadastro de novas contas naaplicação.NajaneladoSolutionExplorer,cliquecomobotãodireitononomedoprojetoeescolhaaopçãoAdd>NewItem.

Najaneladenovoitem,escolhaaopçãoWindowsFormeutilizeFormCadastroContacomonomedonovo formulário que será criado.Dentro desse formulário, coloque dois campos de texto, umchamadotextoNumeroeoutrochamadotextoTitular.Alémdisso,adicionetambémumnovobotão nesse formulário. Esse será o botão que cadastrará a nova conta. Chame o botão debotaoCadastro.

2. Vamos agora implementar a ação do botão de cadastro desse novo formulário (oFormCadastroConta).Dêumduplocliquenobotãoqueacabamosdeadicionar.Dentrodaaçãodobotão, leia as informações que foram digitadas no formulário e utilize-as para criar uma novaContaCorrente:

privatevoidbotaoCadastro_Click(objectsender,EventArgse){ContaCorrentenovaConta=newContaCorrente();novaConta.Titular=newCliente(textoTitular.Text);novaConta.Numero=Convert.ToInt32(textoNumero.Text);}

AgoralocalizeoconstrutordoFormCadastroConta:

publicFormCadastroConta(){InitializeComponent();

Seuslivrosdetecnologiaparecemdoséculopassado?

12.2EXERCÍCIOS

.

Page 115: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}

Façacomqueesse construtor recebaumargumentodo tipoForm1 chamadoformPrincipal.Guardeovalorquefoipassadodentrodeumnovoatributo.Seucódigodeveficarparecidocomoquesegue:

publicpartialclassFormCadastroConta:Form{privateForm1formPrincipal;

publicFormCadastroConta(Form1formPrincipal){this.formPrincipal=formPrincipal;InitializeComponent();}

privatevoidbotaoCadastro_Click(objectsender,EventArgse){ContaCorrentenovaConta=newContaCorrente();novaConta.Titular=newCliente(textoTitular.Text);novaConta.Numero=Convert.ToInt32(textoNumero.Text);}}

3. Dentrodaclassedoformulárioprincipal,arquivoForm1.cs,adicioneumnovoatributochamadonumeroDeContas e umnovométodo chamadoAdicionaConta que receberáuma conta comoargumentoeacadastraránoarraydecontasdoformulário:

publicpartialclassForm1:Form{privateintnumeroDeContas;

//EssearrayjáestavadeclaradonaclasseprivateConta[]contas;

//implementaçãodasaçõesdoformulário

publicvoidAdicionaConta(Contaconta){this.contas[this.numeroDeContas]=conta;this.numeroDeContas++;comboContas.Items.Add("titular:"+conta.Titular.Nome);}}

4. Abranovamenteocódigodobotãodoformuláriodecadastrodenovascontas.DentrodométodobotaoCadastro_Click,utilizeoAdicionaContadoformPrincipalpassandoacontaquefoicriadaanteriormente.

privatevoidbotaoCadastro_Click(objectsender,EventArgse){ContaCorrentenovaConta=newContaCorrente();novaConta.Titular=newCliente(textoTitular.Text);novaConta.Numero=Convert.ToInt32(textoNumero.Text);

this.formPrincipal.AdicionaConta(novaConta);}

.

Page 116: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

5. Dentro do formulário principal da aplicação (Form1.cs), coloque um novo botão que quandoclicadomostraráoformuláriodecadastro.ChameessenovobotãobotaoNovaConta.

privatevoidbotaoNovaConta_Click(objectsender,EventArgse){FormCadastroContaformularioCadastro=newFormCadastroConta(this);formularioCadastro.ShowDialog();}

6. Antesdetestarocadastrodecontasqueacabamosdeimplementar,abraométodoForm1_LoaddoformulárioprincipalecadastreascontaspadrãodosistemautilizandoométodoAdicionaContaquecriamosemumexercícioanterior:

privatevoidForm1_Load(objectsender,EventArgse){this.contas=newConta[10];

//vamosinicializaralgumasinstânciasdeConta.Contac1=newConta();c1.Titular=newCliente("victor")c1.Numero=1;this.AdicionaConta(c1);

Contac2=newContaPoupanca();c2.Titular=newCliente("mauricio");c2.Numero=2;this.AdicionaConta(c2);

Contac3=newContaCorrente();c3.Titular=newCliente("osni");c3.Numero=3;this.AdicionaConta(c3);}

Depoisdefazeressamodificaçãofinal,executeaaplicaçãoetesteocadastro.

7. (Opcional)Noformuláriodecadastro,adicioneumcombobox(chamadocomboTipoConta) quepermitaaescolhadotipodecontaqueserácadastrado.

8. (Desafio)Noprojetoestamosatualmenteutilizandoumarraydecontascomumtamanhofixoeporissosópodemoscadastrarumnúmerolimitadodecontas.ModifiqueométodoAdicionaContadaclasseForm1paraqueeleaceiteumnúmeroilimitadodecontas.

.

Page 117: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO13

Em nosso banco os clientes podem ter dois tipos de conta até omomento: conta corrente ou contapoupança.Parainstanciarestestiposdeconta,poderíamosusaroseguintecódigo:

//InstanciarumanovacontacorrenteContaCorrentecontaCorrente=newContaCorrente();

//InstanciaumanovacontapoupançaContaPoupancacontaPoupanca=newContaPoupanca();

Nos capítulos anteriores, aprendemos que essas duas classes têm muito em comum, ambas sãocontas.Nãoapenastêmatributosemcomum,mastambémcomportamentos.Paraevitararepetiçãodocódigoemambasasclasses,vimoscomoisolarestecódigorepetidoemumaclasseConta,efazercomqueasclassesContaCorrenteeContaPoupancaherdemdessaclassemãetodoocódigoemcomum.

Além da reutilização de código, também vimos a possibilidade de escrever métodos que podemreceber argumentos tanto do tipo ContaCorrente quanto do tipo ContaPoupanca , utilizandopolimorfismo.Bastafazermososmétodosreferenciaremotipomaisgenérico,nocaso,Conta:

publicclassTotalizadorDeContas{//...publicvoidSoma(Contaconta){//...}}

Masoqueacontecequandoexecutamosaseguintelinha:

Contac=newConta();

CriamosumnovoobjetodotipoConta.Masesseobjetofazalgumsentidoparanossasregrasdenegócio?Éumacontagenérica,nãosendonemcontacorrenteenempoupança.

Nestecaso,nãodeveríamospermitirainstanciaçãodeobjetosConta.

Contaéapenasumaideiaemnossodomínio,umaformagenéricadereferenciarmososdoistiposdecontaquerealmenteexistememnossosistema,ContaCorrenteeContaPoupanca.PodemosevitaracriaçãodeobjetosdotipoContadefinindoaclassecomoabstrata:

publicabstractclassConta{//...

CLASSESABSTRATAS

.

Page 118: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}

Destaforma,nãopodemosmaiscriarobjetosdotipoConta,maspodemosaindausarvariáveisdotipoconta,parareferenciarobjetosdeoutrostipos:

Contaconta=newConta();//nãocompila,nãopodecriarobjetosabstratos

Contacc=newContaCorrente();//pode,objetoédotipoContaCorrente

Contacp=newContaPoupanca();//pode,objetoédotipoContaPoupanca

ReparequeocalculonecessáriopararealizarumsaqueédiferenteemcadaumdostiposdeConta.SabemosqueumacontadeveterummétodoSaca,masa implementaçãodestemétododependederegras específicas de cada tipo diferente de conta em nosso sistema. Uma solução possível seriaimplementá-losemfazernada,masdizendoqueelepodesersobrescrito(virtual):

publicabstractclassConta{publicvirtualvoidSaca(doublevalor){//nãofaznada}//...}

EmanterocódigoSacaoriginalnasclassesfilhas,dizendoqueelessobrescrevem(override)ométodonaclassepai:

publicclassContaCorrente:Conta{publicoverridevoidSaca(doublevalor){this.Saldo-=(valor+0.10);}//...}

publicclassContaPoupanca:Conta{publicoverridevoidSaca(doublevalor){this.Saldo-=valor;}//...}

Desejamosquetodaclassefilhaimplementesuaprópriaversãodométodo,comocomportamentoreferenteaotipodaconta.MasseesquecermosdesobrescreverométodoSacaemumasubclasse,ométodoherdadoda classeConta será executado, que não faz nada.Não queremos isso!QueremosobrigarasclassesfilhaaimplementarométodoSaca.

Podemosobrigartodasasclassesfilhasasobrescreveremummétodonaclassemãe,bastadeclararessemétodocomomodificadorabstractaoinvésdevirtual.Todavezquemarcamosummétodocomomodificadorabstract,eleobrigatoriamentenãopodeterumaimplementaçãopadrão:

publicabstractclassConta//marcandoqueaclasseestáincompleta

.

Page 119: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{publicabstractvoidSaca(doublevalor);//marcandoqueométodoestáincompleto}

Comessamodificação,ométodoSacapassaarepresentarapenasumaideia,queprecisadeumaimplementação concreta nas classes filhas. Caso não implementemos esse método na classe filha, ocompilador emitirá um erro, avisando da obrigatoriedade de sobrescrever este método. Então seimplementássemos,porexemplo,aclasseContaPoupancasemdefiniraimplementaçãodoSaca, ocódigodaclassenãocompilará:

publicclassContaPoupanca:Conta{//EssaclassenãocompilapoisnãocolocamosaimplementaçãoparaoSaca}

Podemosterumaclasseabstratasemnenhummétodoabstrato,masnãoocontrário.Seaclassetempelomenosummétodoabstrato,eladeveserabstratatambémpoiscomoométodoestáincompleto,aclassenãoestácompleta.

1. Transforme a classe Conta em uma classe abstrata. Repare que agora teremos um erro decompilação em todos os pontos do código em que tentamos instanciar o tipoConta. Por quê?Modifiqueocódigodasuaaplicaçãoparaqueacontanãoseja instanciada,assimcorrigiremososerrosdecompilação.Nãoseesqueçadesempretestaroseucódigo.

2. ReparequeherdamososmétodosSacaeDepositadaclasseConta,porémcadatipodeContasobrescreve essesmétodos, logo eles são bons candidatos paramétodos abstratos. Transforme osmétodosSacaeDepositaemmétodosabstratos,reparequecomissotodasasclassesfilhassãoobrigadasadarumaimplementaçãoparaessesmétodos.

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

13.1EXERCÍCIOS

Agoraéamelhorhoradeaprenderalgonovo

.

Page 120: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO14

Nosso banco agora suporta Contas de Investimento. Já sabemos como fazer: basta herdar da classeConta:

publicclassContaInvestimento:Conta{//comportamentosespecíficosdacontainvestimento}

Por lei, uma vez por ano devemos pagar um tributo ao governo relacionado às contas deinvestimentoecontasdepoupança.OmesmonãoacontececomumasimplesContaCorrente.

Pararesolveresseproblema,podemoscriarummétodoemambasasclassesquecalculaovalordessetributo.Porexemplo:

publicclassContaPoupanca:Conta{//outrosmetodos

publicdoubleCalculaTributo(){returnthis.Saldo*0.02;}}publicclassContaInvestimento:Conta{//outrosmetodos

publicdoubleCalculaTributo(){returnthis.Saldo*0.03;}}

Excelente.OsmétodossóficamnasContasquerealmentesofremessetributo.

Agora, a próxima funcionalidade é a geração de um relatório, no qual devemos imprimir aquantidade total de tributos pagos por todas as Contas Investimento ou Poupanca do nosso banco.Precisamosdeumaclassequeacumulaovalordetodosostributosdetodasascontasdobanco.Esseéumproblemaparecidocomoquejátivemosantes:

publicclassTotalizadorDeTributos{publicdoubleTotal{get;privateset;}

publicvoidAcumula(ContaPoupancacp){Total+=cp.CalculaTributo();}

INTERFACES

.

Page 121: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicvoidAcumula(ContaInvestimentoci){Total+=ci.CalculaTributo();}}

Pronto.AgorabastapassarmosContaInvestimentoouContaPoupancaenossaclasseacumularáovalordotributo.Reparequetodavezqueumanovacontasofrerumtributo,precisaremoslembrardevoltarnaclasseTotalizadorDeTributosecriarumnovométodoAcumula().

Noscapítulosanteriores,resolvemosissousandopolimorfismo.Seaclassepaipossuirométodoemcomum,entãobastarecebermosumareferênciaprotipopai:

publicclassTotalizadorDeTributos{publicdoubleTotal{get;privateset;}

publicvoidAcumula(Contac){Total+=c.CalculaTributo();}}

MasseráquefazsentidocolocarométodoCalculaTributo()naclasseConta?

publicabstractclassConta{//restodaclasseaquipublicabstractdoubleCalculaTributo();}

Nem todas as Contas são tributáveis. Se fizermos isso, a classe ContaCorrente ganhará essemétodo,maselanãosofretributo!

Precisamos achar umamaneira de "achar um pai em comum" apenas para aContaCorrente eContaInvestimento.ClassesemC#nãopodemterdoispais.Masoquepodemosfazerédizerparaocompiladorque garantiremos a existênciadométodoCalculaTributo() nas classes que chegaremparaométodoAcumula().

Comofazemosisso?Simples.Fazemosaclasse"assinar"umcontrato!Nessecaso,queremosassinarocontratoquefalaquesomosTributáveis.ContratosnoC#sãoconhecidoscomointerfaces.Adeclaraçãodeumainterfaceépraticamenteigualadeumaclasse,porémutilizamosapalavrainterfaceaoinvésdeclass.

publicinterfaceTributavel{//códigodainterface}

AconvençãodenomesdoC#paraumainterfaceéseguiramesmaconvençãodenomenclaturadeclassesporémcomumInocomeçodonome:

publicinterfaceITributavel{

}

.

Page 122: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Éumaboapráticacolocarocódigodainterfacedentrodeumarquivoseparadocomomesmonomedainterface.Porexemplo,ainterfaceITributavelficarianoarquivoITributavel.cs.Dentrodainterface,queremoscolocaradeclaraçãodométodoCalculaTributo().Métodosdeclaradosemumainterface nunca possuem implementação e sempre são públicos. A declaração da interfaceITributavelcomométodoCalculaTributo()ficadaseguinteforma:

//ArquivoITributavel.cs

publicinterfaceITributavel{doubleCalculaTributo();}

QueremosfazercomqueacontapoupançaassineocontratoITributavelqueacabamosdecriar,paraisso,precisamoscolocaronomedainterfacequequeremosimplementarlogoapósadeclaraçãodaclassepai:

//ArquivoContaPoupanca.cs

publicclassContaPoupanca:Conta,ITributavel{//ImplementaçãodosmétodosdaContaPoupanca}

Comoa interfaceITributaveldeclaraométodoCalculaTributo(), toda classe que assina ainterface é obrigada a dar uma implementação para essa funcionalidade, se não implementarmos ométododainterface,aclassenãocompilará.

publicclassContaPoupanca:Conta,ITributavel{//restodaclasseaqui

//métodoquesouobrigadoaimplementarpublicdoubleCalculaTributo(){returnthis.Saldo*0.02;}}

Repare que, para implementarmos o método da interface, não podemos utilizar a palavraoverride , ela é reservada para a sobrescrita de métodos da Herança. A mesma coisa para aContaInvestimento:

publicclassContaInvestimento:Conta,ITributavel{//restodaclasseaqui

//métodoquesouobrigadoaimplementarpublicdoubleCalculaTributo(){returnthis.Saldo*0.03;}}

Alémdisso,podemosfazercomqueumaclasseassineumainterfacesemherdardeoutraclasse.Por

.

Page 123: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

exemplo, o banco também trabalha com seguros de vida que também são tributáveis, logo podemosrepresentaressaclassecomoseguintecódigo:

publicclassSeguroDeVida:ITributavel{publicdoubleCalculaTributo(){//implementaçãodoCalculaTributo}}

Dessa forma, podemos dizer que a classe TotalizadorDeTributos recebe um ITributavelqualquer.Opolimorfismofuncionacominterfaces!

publicclassTotalizadorDeTributos{publicdoubleTotal{get;privateset;}

publicvoidAcumula(ITributavelt){Total+=t.CalculaTributo();}}

Excelente!Vejaquecominterfacesconseguimosfazercomqueumconjuntodeclassesimplementeosmesmosmétodos.

Interfaces são bemmais simples do que classes. Elas não tem atributos e seusmétodos não temimplementação.Ainterfaceapenasnosgarantequeométodoexistiránaquelaclasse.Poressemotivo,apesardeC#não suportarherançamúltipla (ser filhodemaisdeumaclasse),podemos implementarquantasinterfacesquisermos.Bastacolocarumanafrentedaoutra:

publicclassContaInvestimento:Conta,ITributavel,OutraInterfaceQualquer{//implementaosmétodosdasinterfacesTributaveleOutraInterfaceQualquer}

Quando uma classe utiliza tanto herança quanto interfaces, precisamos sempre declarar qual é aclassepaiedepoisasinterfaces,assimcomofizemosnaContaPoupanca:

//Reparequeprimeirocolocamosaclassepai(Conta)edepoisasinterfaces.//Semudarmosaordem,ocódigonãocompilará.publicclassContaPoupanca:Conta,ITributavel{//implementação}

Acostume-secominterfaces.Daquiprafrente,veremosasváriasinterfacesqueexistemnoC#!

1. O banco precisa gerenciar os impostos que serão pagos por seus produtos. Para resolver esseproblema,criaremosumanovainterfacechamadaITributavel.Paracriarainterface,cliquecomobotãodireitodomousenonomedoprojetoeescolhaaopçãoAdd>NewItem(omesmoque

14.1EXERCÍCIOS

.

Page 124: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

utilizamosparacriaroformuláriodecadastro).Najaneladenovoitem,escolhaaopçãoInterfaceecoloqueonomeITributavel:

Faça com que essa interface declare um método chamado CalculaTributos que não recebenenhumargumentoedevolveumdoublequerepresentaovalordoimpostoquedeveserpago.

Ocódigodainterfacedeveficarparecidocomoseguinte:

publicinterfaceITributavel{doubleCalculaTributos();}

2. Oqueacontecesetentarmosinstanciarumainterface?

ITributavelt=newITributavel();

Errodecompilação.Interfacesnãotemimplementaçãoe,logo,nãopodemserinstanciadas.

Ocódigocompila,masoobjetonãofaznada.

OC#buscaaleatoriamenteumaclassequeimplementaessainterfaceeainstancia.

3. Façacomquea classeContaCorrente implemente a interfaceITributavel que acabamosdecriar,porémaindanãoimplementeométodoCalculaTributos.Tenteexecutarocódigo.Oqueaconteceu?

4. ComoaContaCorrenteassinaainterfaceITributavel,precisamoscolocarumaimplementaçãopara ométodoCalculaTributos dentro da classe, se não o código do projeto não compilará.

.

Page 125: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

ImplementeométodoCalculaTributosdaContaCorrente, façacomqueaContaCorrentepague5%deseusaldocomoimposto.

5. CrieumanovaclassenobancochamadaSeguroDeVidaefaçacomqueessaclasseimplementeainterfaceITributavel.OmétodoCalculaTributosdoSeguroDeVidadevedevolverumvalorconstantede42reais.

6. Agoravamosadicionarumnovobotãonoformulárioquecalcularáosimpostosdobanco.Chame-odebotaoImpostos. No código desse botão, teste o método CalculaTributos em diferentessituações,porexemplo:

privatevoidbotaoImpostos_Click(objectsender,EventArgse){ContaCorrenteconta=newContaCorrente();conta.Deposita(200.0);

MessageBox.Show("impostodacontacorrente="+conta.CalculaTributos());ITributavelt=conta;

MessageBox.Show("impostodacontapelainterface="+t.CalculaTributos());

SeguroDeVidasv=newSeguroDeVida();MessageBox.Show("impostodoseguro="+sv.CalculaTributos());

t=sv;MessageBox.Show("impostodoseguropelainterface"+t.CalculaTributos());}

Depoisdeimplementarseustestes,tenteclicarnobotãoparaveroqueacontece.

7. (Opcional) Crie uma nova classe chamada TotalizadorDeTributos, que será responsável poracumularosimpostosdediferentesprodutostributáveisdobanco:

publicclassTotalizadorDeTributos{publicdoubleTotal{get;privateset;}

publicvoidAdiciona(ITributavelt){this.Total+=t.CalculaTributos();}}

Depoisdecriaressaclasse,modifiqueocódigodobotãodoexercíciopassadoparaqueeleutilizeaclassequeacabamosdecriarparacalcularototaldeimpostos.Porexemplo:

privatevoidbotaoImpostos_Click(objectsender,EventArgse){ContaCorrenteconta=newContaCorrente();conta.Deposita(200.0);

SeguroDeVidasv=newSeguroDeVida();

TotalizadorDeTributostotalizador=newTotalizadorDeTributos();totalizador.Adiciona(conta);MessageBox.Show("Total:"+totalizador.Total);totalizador.Adiciona(sv);

.

Page 126: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

MessageBox.Show("Total:"+totalizador.Total);}

8. (Desafio) Pesquise sobre a palavra is do C# no seguinte link http://msdn.microsoft.com/en-us/library/scekt9xw.aspxedepoistentemodificarocódigoobotãoparaqueelesejacapazdecalcularautomaticamenteoimpostodetodasascontascorrentesqueestãocadastradasnoarraydecontasdaaplicação.

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

Agoraéamelhorhoradeaprenderalgonovo

.

Page 127: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO15

Precisamosagoraguardaraquantidadedecontascorrenteexistentesnosistema.Umadasmaneirasdefazerissoégerenciarototaldecontaseadicionar1unidadenessetotaltodavezquecriarmosumanovaconta:

inttotalDeContasCorrente=0;

//...

ContaCorrentenovaConta=newContaCorrente();totalDeContasCorrente++;

Contudo, utilizando essa abordagem, um desenvolvedor pode esquecer de alterar a variáveltotalDeContasCorrenteapóscriarumanovaContaCorrente, gerandoumerrono sistema.Paraevitar isso,seriamelhorqueaprópriaclassecontrolasseototaldecontascriadas.Umaprimeira ideiaseriaguardarumatributocomototaldecontascriadasnaclassee,noseupróprioconstrutor,adicionarumaunidadenesseatributo:

publicclassContaCorrente:Conta{//OutrosatributosdaclasseprivateinttotalDeContas=0;

publicContaCorrente(){this.totalDeContas++;}

//Métodosdaclasse}

QualseriaovalordoatributototalDeContassefossemcriadasduascontas?

ContaCorrenteprimeira=newContaCorrente();ContaCorrentesegunda=newContaCorrente();

Ambasascontasapresentariamovalor1noseuatributototalDeContas.IssoaconteceporqueoatributototalDeContas édiferentepara cadaobjetoque instanciamos, isto é,o atributopertenceacadaobjeto.

Oquedesejamoséquequetivéssemosumatributocompartilhadoemtodososobjetosdaclasse,ouseja,queoatributopertençaàclasseaoinvésdosobjetos.

Estesatributosrecebemonomedeatributosdaclasseouatributosestáticose,emC#,paracriarum

MÉTODOSEATRIBUTOSESTÁTICOS

.

Page 128: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

atributoestáticobastacolocarapalavrastaticnadeclaraçãodoatributo:

publicclassContaCorrente:Conta{privatestaticinttotalDeContas=0;//restodocódigoexistente}

Comisso,onossoconstrutorficaria:

publicclassContaCorrente:Conta{privatestaticinttotalDeContas=0;publicContaCorrente{ContaCorrente.totalDeContas++;}//restodocódigoexistente}

Opróximopassoécriarumcontrolequemostraqualonúmerodapróximacontadisponível,istoé,ototaldecontasmaisum.Comisso,criaríamosummétodopúblicoquedevolvaototalDeContas+1:

publicclassContaCorrente:Conta{privatestaticinttotalDeContas=0;publicContaCorrente{ContaCorrente.totalDeContas++;}publicintProximaConta(){returnContaCorrente.totalDeContas+1;}//restodocódigoexistente}

Mascomoométodopertenceaoobjeto (nãoé estático) enãoà classe, temosque instanciarumacontaparapoderacessá-lo:

//aquiototalé0,imprimiria1,quedesejamos

ContaCorrenteconta=newContaCorrente();conta.ProximaConta();//imprime2,poisjácriamosuma

PercebaqueprecisamoscriarumnovoobjetoparachamarométodoProximaConta.Mas,aocriarumanovaconta,ovalordototalDeContasjáfoialterado.Paraevitarisso,ométodoprecisapertenceràclasseaoinvésdoobjeto.Demaneirasemelhanteaumatributoestático,colocandoapalavrastaticaodeclararummétodo,estesetornaestático:

publicclassContaCorrente:Conta{//restodocódigoexistente

publicstaticintProximaConta(){

.

Page 129: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

returnContaCorrente.totalDeContas+1;}}

Eparausaressenovométodo:

intproxima=ContaCorrente.ProximaConta();

1. Nocadastrodecontas,estamospedindoonúmeroqueserácadastradonanovaconta,masemnossobanco,duascontasnãopodemteromesmonúmero.Paragarantirmosqueonúmerodascontasseráúnico,podemosutilizarostaticdoC#paracriarumcontadordeinstânciasdecontasqueforamcriadas.

DeclarenaclassecontaumnovoatributoestáticochamadonumeroDeContasquecontaráquantascontasforamcriadasnaaplicação.AdicioneumconstrutornaclassContaquenãorecebenenhumargumentoegeraoNumeroutilizandoovalordoatributoestáticonumeroDeContas:

publicabstractclassConta{privatestaticintnumeroDeContas;

publicConta(){Conta.numeroDeContas++;this.Numero=Conta.numeroDeContas;}

//Restodaclassecontinuaigual}

2. Abraoformuláriodecadastrodenovascontas.Procurenocódigodesseformulárioaaçãodobotãoque cadastra a nova conta utilizando os dados digitados pelo usuário, métodobotaoCadastro_Click.Dentrodessemétodo,apaguealinhaqueatribuionúmerodacontaqueserácriada.Essenúmeroagoraégeradopelaprópriaclasseconta.

3. Agoraqueacontageraseunúmero,nãoémaispossívelparaousuáriosaberqualseráonúmerodacontaqueserácadastrada.Pararesolvermosesseproblema,vamosmostrarqualseráonúmerodapróximacontanocampotextoNumerodoformuláriodecadastro.

OnumeroDeContaséumatributoestáticoeprivadodentrodaclasseConta, logoo formulárionão pode acessar o valor desse atributo paramostrá-lo. Crie um novométodo estático na classeContachamadoProximoNumeroqueseráresponsávelpordevolveronúmerodapróximaContaqueserácriadapelaaplicação.

ComoovalordoatributonumeroDeContaséincrementadoapenasquandooconstrutordaContaé executado, para exibir qual será o próximo número da conta que será criada, retorne onumeroDeContas+1:

15.1EXERCÍCIOSOPCIONAIS

.

Page 130: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicstaticintProximoNumero(){returnnumeroDeContas+1;}

4. Agoravamosfazeroformuláriodecadastromostraronúmerodapróximacontaparaousuário.DêumduplocliquenoformuláriodecadastroparafazercomqueoVisualStudiocrieométodoqueserá executado no load do formulário. Dentro desse método, mostre o resultado do métodoConta.ProximoNumero()nocampotextoNumero.

privatevoidFormCadastroConta_Load(objectsender,EventArgse){textoNumero.Text=Convert.ToString(Conta.ProximoNumero());}

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

Algumasvezescriamosclassesquecontêmapenasmétodosauxiliaresestáticos.Comoessasclassesnão possuem métodos nem propriedades de instâncias, não queremos permitir que elas sejaminstanciadas.Nessassituações,podemosutilizarasclassesestáticasdoC#.Paracriarumaclasseestática,precisamosapenasutilizarapalavrastaticemsuadeclaração:

publicstaticclassFunções{//implementação}

Quando uma classe é declarada como estática, ela não pode ser instanciada e nem herdada e,portanto,sópodepossuirmembrosestáticos.

publicstaticclassFuncoes{//Essemétodoéválidodentrodeumaclasseestática.publicstaticboolMetodoEstatico(){

EditoraCasadoCódigocomlivrosdeumaformadiferente

15.2PARASABERMAISCLASSESESTÁTICAS

.

Page 131: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

//implementação}

//Essemétodonãoéválidodentrodeumaclasseestática.publicboolMetodoInstancia(){//implementação}}

.

Page 132: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO16

VoltandoànossaclasseContaPoupanca,umdosseusmétodoséoSaca.Setentarmossacarumvalorsuperioraosaldodocliente,ométodonãopermitiráosaque.Contudo,quemchamouométodonãosaberáseosaquefoirealizadoounão.Comonotificarqueminvocouométodoqueosaquefoifeitocomsucessoounão?

UmaprimeirasoluçãoseriaalterarométodoSacapararetornarumbooleanoindicandoseosaquefoiounãoefetuado:

publicclassContaPoupanca:Conta{publicoverrideboolSaca(doublevalor){if(valor+0.10<=this.Saldo){this.Saldo-=valor+0.10;returntrue;}else{returnfalse;}}//Restodocódigodaclasse}

Assim,podemossaberseosaquefoiefetuadoaochamarométodo:

Contaconta=newContaPoupanca();//Inicializaacontaif(conta.Saca(100.0)){MessageBox.Show("Saqueefetuado");}

Essaabordageméimportante,porexemplo,nocasodeumcaixaeletrônico.Nósprecisamossaberseosaquefoiefetuadoounãoantesdeliberarmosodinheiroparaocliente.Contudo,umadesvantagemdessaabordageméque,seesquecermosdetestaroretornodométodoSaca,podemosliberardinheiroparaoclientesempermissão.

Emesmo invocando ométodo e tratando o seu retornodemaneira adequada, o que faríamos se

EXCEÇÕES

16.1RETORNODOMÉTODOPARACONTROLARERROS

.

Page 133: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

fosse necessário sinalizar exatamente qual foi o tipo de erro que aconteceu, como quando o usuáriopassouumvalornegativocomoquantidade?

Umasoluçãoseriaalteraroretornodebooleanparanúmerointeiroeretornarocódigodoerroqueocorreu. Isso é considerado uma má prática, pois o valor devolvido é "mágico" e só legível peranteextensadocumentação(magicnumbers),alémdenãoobrigaroprogramadoratrataresseretorno,oquepodelevaroprogramaacontinuarexecutandoemumestadoinconsistente.

Umoutroproblemaaconteceriaseométodojáretornassealgumvalor.Dessejeito,nãodariaparaalteraroretornoparaindicarseosaquefoirealizadoounão.

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

Paraevitaressesproblemas,oC#nospermitetrataressasexceçõesàregradeumamaneiradiferente:atravésdeexceptions.Emvezderetornarmosumvalordizendoseumaoperaçãofoibemsucedida,nóslançamos uma exceção à regra padrão, ao comportamento padrão, dizendo que algo de erradoaconteceu. No nosso caso, utilizaremos a exceção Exception, indicando que houve um erro naoperaçãodesaque:

publicclassContaPoupanca:Conta{publicoverridevoidSaca(doublevalor){if(valor+0.10>this.Saldo){thrownewException("Valordosaquemaiorqueosaldo");}else{this.Saldo-=valor+0.10;}}}

EditoraCasadoCódigocomlivrosdeumaformadiferente

16.2CONTROLANDOERROSCOMEXCEÇÕES

.

Page 134: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Atéomomento,aprendemoscomolançarumaexceptionquandoalgumcomportamentoocorreudeforma fora do comum.Mas, o que essa exception influencia na classe que o chamou? Por exemplo,vamos ver o que acontece quando tentamos sacar um valor superior ao saldo do cliente. Rode a suaaplicaçãocomF5etentesacarumvalorsuperioraosaldodeumcliente.

Aoclicarnobotãodesaque,aexecuçãodocódigoserá interrompidana linhaemqueaexceçãoélançada.IssoocorreporqueoF5rodaonossoprogramaemmododebug.SerodarmosoprogramaforadomododebugcomCtrl+F5,comosefosseumusuáriorodandooprograma,veríamosumajaneladizendoqueocorreuumerro:

Mas, nósnãoqueremos que ousuário receba talmensagemna tela. Então, nãopodemos chamardiretamente um método que pode lançar uma exceção. Ao invés disso, devemos tentar chamar ométodo:senãofor lançadanenhumaexceção,ok;casocontrário,devemospegaraexceçãoeexecutarumtrechodecódigoreferenteàexceção.

Paratentarexecutarumtrechodecódigoquepodelançarumaexceção,devemoscolocá-lodentrodeumblocotry.Nonossocaso,colocaremosdentrodoblocoquetrataocliquedobotãosaque:

privatevoidbotaoSaque_Click(objectsender,EventArgse){intindice=comboContas.SelectedIndex;doublevalor=Convert.ToDouble(textoValor.Text);Contaselecionada=this.contas[indice];try{selecionada.Saca(valor);textoSaldo.Text=Convert.ToString(selecionada.Saldo);MessageBox.Show("DinheiroLiberado");}}

Eparapegaraexceçãocasosejalançadaetratá-la,devemospôrocódigodentrodeumblockcatch:

privatevoidbotaoSaque_Click(objectsender,EventArgse){intindice=comboContas.SelectedIndex;doublevalor=Convert.ToDouble(textoValor.Text);Contaselecionada=this.contas[indice];try{selecionada.Saca(valor);

.

Page 135: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

textoSaldo.Text=Convert.ToString(selecionada.Saldo);MessageBox.Show("DinheiroLiberado");}catch(Exceptionex){MessageBox.Show("Saldoinsuficiente");}}

Nessebloco,casoométodoSaca lanceumaexceção,oblococatch será executadomostrandoamensagemSaldoInsuficiente.Nocasodeumaexceção,amensagemDinheiroLiberadonãoéexibida.

Uma outra situação exceptional ocorre quando o usuário da classeConta tenta sacar um valornegativo,claramenteumvalorinválidoparaosaque.Nessecasotambémqueremoslançarumaexceção:

publicoverridevoidSaca(doublevalor){if(valor<0.0){thrownewException();}if(valor+0.10>this.Saldo){thrownewException("Valordosaquemaiorqueosaldo");}else{this.Saldo-=valor+0.10;}}

QuandopassamosumvalornegativoparaométodoSaca, ométodo lançaráumaException,portantoo códigodoblococatch do caixa eletrônico será executado para tratar a exceção gerada,exibindoparaousuárioamensagemSaldoInsuficiente. Porémessamensagemestá claramenteerrada.

Repareque,parajogarmosaexceção,precisamosexecutarumnew,ouseja,aExceptionéumaclassedoC#!Podemoscriarumahierarquiadeexceçõesutilizandoaherançaparaindicarqualfoiotipodeerroqueocorreu.

Para criarmos um novo tipo de exceção, precisamos apenas criar uma nova classe que herde deException.Vamoscriarumaexceçãoqueindicaqueocorreuumerroporsaldoinsuficientenaconta,aSaldoInsuficienteException:

publicclassSaldoInsuficienteException:Exception{}

EvamosutilizaroSaldoInsuficienteExceptionnométodoSacadaclasseContaPoupanca:

16.3TRATANDOMÚLTIPLASEXCEÇÕES

.

Page 136: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicoverridevoidSaca(doublevalor){if(valor<0.0){thrownewException();}if(valor+0.10>this.Saldo){thrownewSaldoInsuficienteException();}else{this.Saldo-=valor+0.10;}}

Quandoousuáriopassaumargumentonegativoainda lançamosumaexceçãogenérica.Podemoscriarumnovotipodeexceçãoqueindicaqueoargumentopassadoéinválido.Porém,oC#jápossuiumconjunto de exceções padrão na linguagem (http://msdn.microsoft.com/pt-br/library/system.exception.aspx#inheritanceContinued). Dentre essas exceções, existe aArgumentException, que indica que o argumento de um método é inválido. Vamos utilizar essaexceçãononossocódigo:

publicoverridevoidSaca(doublevalor){if(valor<0.0){thrownewArgumentException();}if(valor+0.10>this.Saldo){thrownewSaldoInsuficienteException();}else{this.Saldo-=valor+0.10;}}

Agoraocódigodocaixaeletrônicopodetratardeformadiferentecadaumdostiposdeexceção:

privatevoidbotaoSaque_Click(objectsender,EventArgse){intindice=comboContas.SelectedIndex;doublevalor=Convert.ToDouble(textoValor.Text);Contaselecionada=this.contas[indice];try{selecionada.Saca(valor);textoSaldo.Text=Convert.ToString(selecionada.Saldo);MessageBox.Show("DinheiroLiberado");}catch(SaldoInsuficienteExceptionex){MessageBox.Show("Saldoinsuficiente");}catch(ArgumentExceptionex){MessageBox.Show("Nãoépossívelsacarumvalornegativo");

.

Page 137: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}}

Masoquedevesercolocadodentrodeumblocotry?Seráquedevemoscolocarapenasaexecuçãodométodoquelançaaexceção?

privatevoidbotaoSaque_Click(objectsender,EventArgse){intindice=comboContas.SelectedIndex;doublevalor=Convert.ToDouble(textoValor.Text);Contaselecionada=this.contas[indice];try{selecionada.Saca(valor);}catch(SaldoInsuficienteExceptionex){MessageBox.Show("Saldoinsuficiente");}catch(ArgumentExceptionex){MessageBox.Show("Nãoépossívelsacarumvalornegativo");}textoSaldo.Text=Convert.ToString(selecionada.Saldo);MessageBox.Show("DinheiroLiberado");}

Aoexecutarocódigo,vemosqueométodoSacalançaaexceçãodesaldoinsuficiente.Mas,mesmoassim,ocaixaliberadinheiroparaousuário.IssoaconteceporqueaexceçãolançadanométodoSacajáfoitratadanosblocoscatcheaexecuçãodoprogramacontinuanormalmente.

Oblocotry deve conter toda a lógicadenegócioque será executada emuma situaçãonormal,quando não ocorrem casos excepcionais. Assim, podemos nos preocupar apenas com a lógica denegóciosedepoisnospreocupamoscomoserrosqueaconteceram.

Nocasodosaque,queremosexecutarométodoSacaedepoisemitirodinheirodentrodoblocotry.

privatevoidbotaoSaque_Click(objectsender,EventArgse){intindice=comboContas.SelectedIndex;doublevalor=Convert.ToDouble(textoValor.Text);Contaselecionada=this.contas[indice];try{selecionada.Saca(valor);textoSaldo.Text=Convert.ToString(selecionada.Saldo);MessageBox.Show("DinheiroLiberado");}catch(SaldoInsuficienteExceptionex){MessageBox.Show("Saldoinsuficiente");}catch(ArgumentExceptionex){MessageBox.Show("Nãoépossívelsacarumvalornegativo");}}

.

Page 138: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Vejaqueotratamentodoserrosficoutotalmenteisoladodalógicadenegócios.Utilizandoexceções,podemosnospreocuparapenascoma lógicadenegóciodosistemae sódepoiscomo tratamentodeerros.Nãoexistemisturadecódigo!

1. Quaisdasopçõesaseguirrepresentaolançamentodeumanovaexceçãoemnossosistema?

csharpthrownewException();

csharpreturnException();

csharpreturnnewException();

csharpthrowException();

2. Analiseocódigoaseguireassinaleaalternativacorreta:

varconta=newConta();varcaixa=newCaixa();conta.Deposita(100.0);conta.Saca(500.0);caixa.Libera(500.0);

Sealinha4lançarumaexceção,alinha5nãoseráexecutada.

Aúltimalinhanãoseráexecutadamesmoseocódigonãolançarexceções.

Sealinha4lançarumaexceção,nenhumadaslinhasseráexecutada.

Todasaslinhassãoexecutadasmesmoquandoalgumadelaslançaumaexceção.

3. Ondedevemoscolocarumtrechodecódigoquepode lançarumaexceçãoparaquandoqueremostratá-la?

Dentrodeumblocotry

Dentrodeumblococatch

Nãoprecisaestaremnenhumblocoemespecífico.

4. Ondedevemoscolocarocódigoquetrataumaexceção?

Dentrodeumblococatch

Dentrodeumblocotry

Nãoprecisaestaremnenhumblocoemespecífico.

5. Modifique o método Deposita da classe ContaPoupanca para que ele lance um

16.4EXERCÍCIOS

.

Page 139: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

ArgumentExceptionquandooargumentopassadoparaométodofornegativo.Oseumétododeveficarparecidocomoseguinte:

publicclassContaPoupanca:Conta{//restodocódigodaContaPoupancapublicoverridevoidDeposita(doublevalor){if(valor<0.0){thrownewArgumentException();}//restodométodocontinuaigual}}

Depoisdefazeressamodificação,executeaaplicaçãoetentedepositarumvalornegativoemumacontapoupançaevejaoqueacontece.

6. Agorautilizeumtry/catchnaaçãodobotãoquerealizaumdepósito,botaoDeposito_ClickdaclasseForm1,paratrataraexceçãoquepodeser lançadapeloDeposita.QuandooDepositalançarumaexceção,mostreumMessageBoxcomamensagem"ArgumentoInválido".

7. (Opcional) Vamos agora criar uma nova exceção chamada SaldoInsuficienteException queserá lançada toda vez que tentarmos sacar um valor que é superior ao saldo atual da conta. EssaclassedevesimplesmenteherdardaclasseExceptiondoC#:

publicclassSaldoInsuficienteException:Exception{}

Agora modifique o método Saca da classe ContaPoupanca para que ele jogue aSaldoInsuficienteExceptiontodavezqueousuáriotentarsacarumvalormaiordoqueosaldodaconta.

Modifique também o método botaoSaque_Click para que ele mostre a mensagem "SaldoInsuficiente"casoométodoSacalanceaexceçãoSaldoInsuficienteException.

8. (Opcional)FaçaasmesmasmodificaçõesparaaContaCorrente.

9. (Opcional) Um outro bloco que existe é o finally . Pesquise sobre ele emhttp://msdn.microsoft.com/pt-br/library/fk6t46tz(v=vs.71).aspxedigaquandoumcódigodentrodeumblocofinallyéexecutado.

Sempre

Sóseumaexceçãoforlançada.

Nunca

Sósenenhumaexceçãoforlançada

.

Page 140: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

JáconheceoscursosonlineAlura?

.

Page 141: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO17

Comocrescimentodo sistema,passamosa terdiversasclassesnele.Porexemplo, asqueenvolvemomodelodenossosistemacomoasclassesligadasaconta:

publicabstractclassConta{//ImplementaçãodaclasseConta}

publicclassContaCorrente:Conta{//ImplementaçãodaclasseContaCorrente}

publicclassContaPoupanca:Conta{//ImplementaçãodaclasseContaPoupanca}

Asclassesvoltadasaorelacionamentocomocliente:

publicclassCliente{//ImplementaçãodaclasseCliente}

publicclassGerente{//ImplementaçãodaclasseGerente}

Asclassesligadasaosempréstimosfeitospelocliente:

publicclassCredito{//ImplementaçãodaclasseCredito}

publicclassCreditoImobiliario:Credito{//ImplementaçãodaclasseCreditoImobiliario}

Easclassesreferentesaosinvestimentos:

publicclassFundo{//ImplementaçãodaclasseFundo}

publicclassCDB

NAMESPACES

.

Page 142: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{//ImplementaçãodaclasseCDB}

Ograndeproblemaquesurgecomossistemasgrandeséaorganizaçãodetodasassuasclasses.Paraevitarqueosistemafiquecaótico,podemosagruparasclassesporcaracterísticascomunsedarumnomeparacadaumdessesgrupos.Istoé,agruparíamosumconjuntodeclassesemumespaçoemcomumelhedaríamosumnome,comoporexemploCaelum.Banco.Investimentos.Esseespaçodefinidoporumnomeéchamadodenamespace.

Segundo a convenção de nomes adotada pela Microsoft (http://msdn.microsoft.com/en-us/library/893ke618.aspx), os namespaces devem ter a forma:NomeDaEmpresa.NomeDoProjeto.ModuloDoSistema.

Nonossocaso,osnamespacesficariamdaseguinteforma:

namespaceCaelum.Banco.Usuarios{publicclassCliente{//ImplementaçãodaclasseCliente}}

namespaceCaelum.Banco.Usuarios{publicclassGerente{//ImplementaçãodaclasseGerente}}

namespaceCaelum.Banco.Investimentos{publicclassFundo{//ImplementaçãodaclasseFundo}}

namespaceCaelum.Banco.Investimentos{publicclassCDB{//ImplementaçãodaclasseCDB}}

Antes de realizar essa separação de nossas classes em namespaces, elas estavam no mesmonamespace:onamespacedonomedoprojeto.Assim,paradefiniroclientereferenteauminvestimentoprecisaríamosapenascriarumnovoatributonaclasseInvestimento:privateClientecliente.

Contudo, comousodosnamespaces, a classeCliente não estámaisnomesmonamespacedaclasseInvestimento. Para poder referenciar qualquer uma das quatro classes anteriores devemosindicaroseunamespace:

.

Page 143: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Caelum.Banco.Usuarios.Gerenteguilherme=newCaelum.Banco.Usuarios.Gerente();Caelum.Banco.Usuarios.Clientemauricio=newCaelum.Banco.Usuarios.Cliente();Caelum.Banco.Investimentos.Fundoacoes=newCaelum.Banco.Investimentos.Fundo();Caelum.Banco.Investimentos.CDBcdb=newCaelum.Banco.Investimentos.CDB();

Onome completo de uma classe agora envolve adicionar uma referência ao namespace dela. Porisso, deixamos de acessar Gerente diretamente e passamos a acessarCaelum.Banco.Usuarios.Gerente.

Umexemplode código já existentenaplataformaC#queusanamespaces envolve imprimirumaúnicalinhanoconsoleusandoométodoWriteLinedeSystem.Console:

System.Console.WriteLine("Minhacontabancaria");

Notecomoousodenamespacesparaorganizar suasclassesacaba implicandoemmaiscódigonahora de utilizar as mesmas. Por isso, podemos criar atalhos ao dizer que usaremos as classes quepertencemaumnamespace.Porexemplo,podemoscitarqueusaremosonamespaceSysteme,apartirde então, podemos escrever nosso código como se tudo o que está dentro do namespace Systemestivessenomesmonamespaceemqueestamos:

usingSystem;

Console.WriteLine("Minhacontabancaria");

Podemostambémusarváriosnamespacesdentrodomesmoarquivo:

usingSystem;usingCaelum.Banco.Usuarios;

Console.WriteLine("MinhaContaBancaria");Clientecliente=newCliente();

Autilizaçãodapalavrachaveusingpermitenotificaraocompiladorqueusaremosclassesdaquelenamespace. Com isso, obtemos a vantagem da organização do código através de namespace econtinuamoscomumcódigoenxuto.

NoC#,podemoscriarumnamespacedentrodeoutronamespacejáexistente.Porexemplo:

namespaceCaelum.Banco{//dentrodonamespaceCaelum.Banco

//agorapodemoscriarumnamespaceaninhadonamespaceContas{//onomedessenamespaceéCaelum.Banco.Contas}}

17.1PARASABERMAIS-DECLARAÇÃODENAMESPACEANINHADOS

.

Page 144: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

OnamespaceContasdocódigoacimatambémpoderiaserdeclaradodaseguinteforma:

namespaceCaelum.Banco.Contas{//tambémdeclaraonamespaceCaelum.Banco.Contas}

ParaalinguagemC#,asduasdeclaraçõessãoequivalentes.

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

Emaplicaçõesgrandes,podemosternamespacescomnomesmuitograndes,porexemplo:

namespaceCaelum.Banco.Produtos.Contas{publicabstractclassConta{//Implementação}}

Vimos que, no códigoC#, podemos utilizar ousing para não digitarmos o nome completo daclassetodavezqueelaforutilizada,masoqueaconteceriasetivéssemosoutraclassechamadaConta?Porexemplo,obancotemumsistemadeautenticaçãoeaclassequeguardainformaçõessobreousuárioéchamadaConta:

namespaceCaelum.Banco.Seguranca{publicclassConta{//Implementação}}

Claramente, as classes são diferentes pois possuem namespaces diferentes,mas no código que asutiliza,nãopodemosimportarasduasclassespoisocompiladordoC#nãosaberáqualdasduasestamosutilizando.

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

17.2PARASABERMAIS-ALIASPARANAMESPACES

.

Page 145: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

usingCaelum.Banco.Produtos.Contas;usingCaelum.Banco.Seguranca;

namespaceBanco.Sistema{publicclassControleAutenticacao{//ContadousuárioouContadobanco?publicvoidAutentica(Contaconta){//implementação}}}

Nessa situação, precisamos escolher qual é o namespace que vamos importar. Se colocarmos umusingparaCaelum.Banco.Produtos.Contas,porexemplo,parautilizarmosaConta dousuárioprecisamos do nome completo da classe,Caelum.Banco.Seguranca.Conta, umnome bem grande.Nessa situação, podemos dar um apelido (alias) menor para um namespace do C# com a palavrausing:

usingCaelum.Banco.Produtos.Contas;usingSegurancaDoBanco=Caelum.Banco.Seguranca;

namespaceBanco.Sistema{publicclassControleAutenticacao{//ContaéadonamespaceCaelum.Banco.Produtos.Conta//parausarmosacontadousuáriofazemos://SegurancaDoBanco.ContapublicvoidAutentica(SegurancaDoBanco.ContacontaUsuario){//implementação}}}

Podemostambémdefinirumaliasparaumaclassedonamespace:

usingCaelum.Banco.Produtos.Contas;usingContaDoUsuario=Caelum.Banco.Seguranca.Conta;

namespaceBanco.Sistema{publicclassControleAutenticacao{//ContaéadonamespaceCaelum.Banco.Produtos.Conta//parausarmosacontadousuário,utilizamosContaDoUsuariopublicvoidAutentica(ContaDoUsuarioconta){//implementação}}}

17.3EXERCÍCIOS

.

Page 146: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

1. ComoinstanciaraclasseContaaseguir,queestádentrodeumnamespace?

namespaceCaelum.Banco{publicclassConta{//classeaqui}}

newConta();

newConta.Caelum.Banco();

newConta()inCaelum.Banco;

newCaelum.Banco.Conta();

2. Comoimportaraclasseaseguir,usandousing?

namespaceCaelum.Banco{publicabstractclassConta{//codigoaqui}}

usingCaelum;

usingCaelum.Banco;

usingCaelum.Banco.Conta;

3. FaçacomqueonamespacedascontasdaaplicaçãosejaBanco.Contas,porexemplo,paraaclasseConta,teríamos:

//arquivoConta.csnamespaceBanco.Contas{publicclassConta{//implementaçãodaclasseConta}}

Depois de fazermos essamodificação, as classes queutilizam a conta terão que importá-la comousingdoC#.Noformulárioprincipaldaaplicação,classeForm1,porexemplo,teríamos:

usingBanco.Contas;

namespaceBanco{publicclassForm1:Form{//implementaçãodoformulário}}

.

Page 147: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Repare que o namespace é completamente separado da estrutura de pastas do projeto, ou seja,podemosorganizarosarquivosdoprojetodaformaquedesejarmos.

4. (Opcional) Mesmo que a estrutura de diretórios seja completamente separada do namespace, ésemprebomdefinirmosregrasparaaestruturadepastasdoprojeto.Umaestruturamuitoutilizadano .Net é colocar todas as classes de um determinado namespace dentro de um diretório com omesmonomedonamespace.Paraascontasdaaplicação,porexemplo,teríamosaseguinteestrutura:

Vamosmoverosarquivosdoprojetoparaseguirmosessaestrutura.DentrodoprojetoBanco,crieumanovapastachamadaContasedentrodessapastacoloquetodasascontasdosistema.Vejaquepodemosmoverlivrementeosarquivossemquebrarocódigodaaplicação.

.

Page 148: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO18

Emcapítulosanterioresvimosautilizaçãodopolimorfismoparareferenciarmaisdeumtipodeclasse,comoéocasodasclassesContaCorrenteeContaPoupanca.AmbaspodemserreferenciadascomoobjetosdaclasseConta.

MasseráqueContaherdadealguém?Eseherdar,todasasoutrasclassestambémherdariam.Istoé,umaclassequerepresentaabaseparatodososobjetosdosistema...umaclasseObject.OcódigoaseguiréomesmoqueadefiniçãoantigadeConta:

publicabstractclassConta:Object{//código}

ÉdesnecessáriodizermosqueContaherdadeObject.Écomoseoprópriocompiladorfizesseocódigoanterioraodigitarmos:

publicabstractclassConta{//código}

Assim,podemosdizer que toda classe emC# éumObject.UmavezqueConta éObject,ContaCorrenteeContaPoupancapassamaserObjectindiretamente.

Vimosno primeiro capítulo sobre orientação a objetos que quando fazemos uma comparação deduasvariáveisdotipoConta,oquecomparamosnarealidadesãoasreferênciasqueestãoarmazenadasnasvariáveis:

Contac1=newContaCorrente();c1.Numero=1;

Contac2=newContaCorrente();c2.Numero=1;

if(c1==c2){MessageBox.Show("iguais");}else{

CLASSEOBJECT

18.1IMPLEMENTANDOACOMPARAÇÃODEOBJETOS

.

Page 149: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

MessageBox.Show("diferentes");}

Nessecódigo,asduascontascriadasguardamexatamenteasmesmasinformações,porémcomoc1ec2guardamreferências,quandofazemosc1==c2,estamoscomparandoareferênciadavariávelc1comareferênciadavariávelc2e,comoelasapontamparaobjetosdiferentes,ocódigomostraamensagem"diferentes".

Paracorrigiresseproblema,precisamoscompararosvaloresdaspropriedadesdacontaaoinvésdovalor das variáveis c1 e c2 . Por exemplo, no sistema que desenvolvemos, duas contas sãoconsideradasiguaisapenasquandoseusnúmerossãoiguais,entãoocódigodacomparaçãodeveriaficardaseguinteforma:

if(c1.Numero==c2.Numero){MessageBox.Show("iguais");}else{MessageBox.Show("diferentes");}

Portanto,emtodosospontosdosistemaemqueprecisamoscomparardoisobjetosdotipoconta,precisamosrepetiroifacima.Masoqueaconteceriaseprecisássemosmudararegradecomparaçãodeduascontas?Nessecasoteríamosquebuscartodasascomparaçõesdecontasdaaplicaçãoeatualizararegra,oquepodesermuitotrabalhoso.

Pararesolveroproblemadacomparaçãodeobjetos,aMicrosoftintroduziunaclasseObjectummétodoespecializadoemfazeracomparaçãodedoisobjetos,ométodoEquals.Comoemtodaherançaa classe filha ganha os comportamentos da classe pai, podemos utilizar o Equals para fazer acomparaçãoentredoisobjetos:

if(c1.Equals(c2)){MessageBox.Show("iguais");}else{MessageBox.Show("diferentes");}

Porém,aoexecutarmosocódigo,aaplicaçãoaindamostraamensagem"diferentes".IssoocorreporqueaimplementaçãopadrãodoEqualsquevemherdadadaclasseObjectfazacomparaçãodasreferências,ouseja,oifdocódigoanterioraindafazacomparaçãoc1==c2.

Podemos mudar o comportamento padrão do método Equals herdado da classe Objectutilizandoasobrescrita:

publicabstractclassConta{//outraspropriedadesemétodos

.

Page 150: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

//NessemétodoimplementamosaregradeigualdadeentreduascontaspublicoverrideboolEquals(Objectoutro){//Implementaçãodaigualdadedecontas.}}

ReparequeométodoEquals recebeumargumentodo tipoObject, entãopodemosutilizá-loparacompararumacontacomqualquervalordoC#.

DentrodaimplementaçãodométodoEquals,queremosimplementararegradeigualdadeentrecontas—duascontassãoiguaisseosseusnúmerosforemiguais:

publicabstractclassConta{//outraspropriedadesemétodos

//NessemétodoimplementamosaregradeigualdadeentreduascontaspublicoverrideboolEquals(Objectoutro){returnthis.Numero==outro.Numero;}}

Porém,reparequeavariáveloutroédotipoObject,quenãopossuiumapropriedadechamadaNumero,apenasaContapossuiessapropriedade.Então,antesdefazermosacomparaçãoprecisamosconverteravariáveloutroparaotipoContautilizandoocast:

publicabstractclassConta{//outraspropriedadesemétodos

//NessemétodoimplementamosaregradeigualdadeentreduascontaspublicoverrideboolEquals(Objectoutro){ContaoutraConta=(Conta)outro;returnthis.Numero==outraConta.Numero;}}

DepoisdecolocarmosessaimplementaçãodométodoEqualsnaclasseConta, podemos tentarexecutarnovamenteacomparaçãodecontas:

if(c1.Equals(c2)){MessageBox.Show("iguais");}else{MessageBox.Show("diferentes");}

Dessa vez, oC#utilizará a implementaçãodoEquals que colocamosdentroda classeConta,fazendoacomparaçãopelosnúmeros.Portanto,teremosamensagem"iguais".

.

Page 151: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

ReparequeométodoEqualsrecebeotipoObject.Sendoassim,podemoscompararacontacomqualqueroutroobjetodosistema,porexemplo,astring:

Contac=newContaCorrente();

if(c.Equals("Mensagem"))

EnaimplementaçãodoEquals,fazemosocastdoargumentopassadoparaotipoConta,poréma string não é uma conta. Como o cast é inválido, o C# lança uma exceção do tipoInvalidCastException . Para evitarmos essa exceção precisamos verificar que o argumento doEquals é realmentedo tipoConta antesde fazermos a operaçãode cast. Para fazer esse trabalho,podemosutilizarooperadorisdoC#:

publicoverrideboolEquals(Objectoutro){if(outroisConta){//outroédotipoConta,entãopodemosfazerocast}}

Nessecódigo, seavariáveloutro guardarumareferênciaparaumobjetoqueédo tipoConta(instânciadeContaouclassefilha),oisdevolvetrue,senãoeledevolvefalse.

SeoutronãoforumaConta, entãoométododeveriadevolverfalse, do contrário ele devefazerocastecompararosnúmeros.Assim,oEqualspodeserimplementadocomoseguintecódigo:

publicoverrideboolEquals(Objectoutro){//SenãotemosumobjetodotipoConta//Entãoométododevolvefalseif(!(outroisConta)){returnfalse

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

18.2MELHORANDOAIMPLEMENTAÇÃODOEQUALSCOMOIS

.

Page 152: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}

ContaoutraConta=(Conta)outro;returnthis.Numero==outraConta.Numero;}

Nos capítulos anterioresmodificamoso formuláriodoBanco para utilizar um combo box parafazeraorganizaçãodascontascadastradas.Paracolocarmosumnovoitemnocambobox,utilizamosométodoAddemsuapropriedadeItemspassandoqualéonovotextoquequeremosadicionar:

comboContas.Items.Add("NovoItem");

Com isso, o comboboxmostraráumnovo itemcomo texto"NovoItem".Na verdade, quandoutilizamosessemétodoAdd,podemospassarqualquerobjetocomoargumento:

Contac=newContaCorrente();c.Numero=1;

comboContas.Items.Add(c);

QuandopassamosumobjetoparaométodoAdd, oC#precisa transformar esse objeto emumastringqueseráexibidacomoitemdocombobox.ParaissoeleutilizamaisummétodoherdadodaclasseObjectchamadoToString.Aresponsabilidadedessemétodoétransformarumobjetoqualqueremumastring.

AimplementaçãopadrãodométodoToStringquevemherdadodaclasseObjectsimplesmentedevolveastringquerepresentaonomecompletodaclasse,ouseja,nomedonamespaceseguidodonomedaclasse(Banco.Contas.ContaCorrente,nocasodaContaCorrente).Mas,paramostrarmosa conta no combo box, precisamos de uma implementação que descreva a conta que o usuário estáselecionando, então vamos novamente utilizar a sobrescrita de métodos para modificar ocomportamentodoToString:

publicabstractclassConta{//outrosmétodosepropriedades

publicoverridestringToString(){

}}

DentrodessemétodoToString,precisamosdevolverumtextoquedescrevaacontaqueousuárioestáselecionando:

publicabstractclassConta{//outrosmétodosepropriedades

publicClienteTitular{get;set;}

18.3INTEGRANDOOOBJECTCOMOCOMBOBOX

.

Page 153: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicoverridestringToString(){return"titular:"+this.Titular.Nome;}}

AgoraquecolocamosaimplementaçãodoToStringnaclasseConta,aoexecutarmosnovamenteo código que adiciona um item no combo box, o C# mostrará o resultado do ToString que foiimplementado.

1. Assinaleaalternativacorreta

TodasasclassesemC#herdamdiretamenteouindiretamentedeObject

Objectéumaclasseabstrata

SóasclassesquenãoherdamdenenhumaclassesãoherdadasdeObject

Objectéumainterface

2. Analiseocódigoaseguiredigaqualseráasuasaída.

classCliente{publicstringNome{get;set;}publicstringRg{get;set;}publicCliente(stringnome){this.Nome=nome;}publicoverrideboolEquals(Objectobj){ClienteoutroCliente=(Cliente)obj;returnthis.Nome==outroCliente.Nome&&this.Rg==outroCliente.Rg;}}

Clienteguilherme=newCliente("GuilhermeSilveira");guilherme.Rg="12345678-9";

Clientemauricio=newCliente("MauricioAniche");mauricio.Rg="12345678-9";

if(guilherme.Equals(mauricio)){MessageBox.Show("Sãoomesmocliente");}else{MessageBox.Show("Nãosãoomesmocliente");}

Nãosãoomesmocliente

18.4EXERCÍCIOS

.

Page 154: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Ocódigonãocompila

Sãoomesmocliente

Nadaémostrado

Ocódigorodamasquebraaoexecutar

3. VamossobrescreverométodoToStringdaclasseContacomaseguinteimplementação:

publicabstractclassConta{//RestodaimplementaçãodaContapublicoverrideStringToString(){return"titular:"+this.Titular.Nome;}}

AgoraadicionaremosacontaaoinvésdeumastringcomoitemdocomboboxdentrodométodoAdicionaContadoformulárioprincipaldaaplicação,classeForm1:

publicvoidAdicionaConta(Contaconta){this.contas[this.numeroDeContas]=conta;this.numeroDeContas++;comboContas.Items.Add(conta);}

Depoisdefazeressamodificação,testeaaplicaçãoevejaoToStringdacontaemaçãodentrodosopçõesdocombobox.

4. Quandoadicionamosumobjetonocombobox,émaisinteressanterecuperardiretamenteoobjetoquefoiselecionadodoqueoíndicequefoiselecionado.

Para recuperar o objeto que está selecionado em um combo box, utilizamos a propriedadeSelectedItem. Essa propriedade devolve um Object que guarda a instância selecionada nocombobox.

Sabendodisso,podemosmodificaraaçãodobotãodedepósito,botaoDeposito_ClickdaclasseForm1,parautilizaroSelectedItemdocomboContas,queconteráainstânciadacontaqueousuário selecionou na interface gráfica. Porém para podermos utilizar a conta selecionada,precisamosprimeiroconvertê-laparaumainstânciadeConta:

privatevoidbotaoDeposito_Click(objectsender,EventArgse){Contaselecionada=(Conta)comboContas.SelectedItem;

//implementaalógicadedepósitoutilizandoaconta}

Implementeetesteessamodificaçãodentrodoseuprojeto.Façaomesmoparaobotãodesaque.

.

Page 155: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

5. (Opcional)EmalgumassituaçõesnãoqueremosutilizaroToStringdopróprioobjetoparamontara listade itensdocombobox,nessas situações,podemosutilizarumapropriedadedoComboBoxchamadaDisplayMemberparaescolherqualéapropriedadedoobjetoquequeremosincluircomoitemdocombo.Porexemplo,noseguintecódigo,ositemsdocomboboxserão1e2:

Contac=newContaCorrente(){Numero=1};Contac2=newContaCorrente(){Numero=2};comboContas.Items.Add(c);comboContas.Items.Add(c2);comboContas.DisplayMember="Numero";

QuandoutilizamosoDisplayMemberocomboboxtambémutilizaoToStringdomembroparamontaroitemqueseráexibidoparaousuário.

UtilizeoDisplayMemberparamostraroToStringdapropriedadeTitulardacontaaoinvésdemostraroToStringdaprópriaConta.

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

Seuslivrosdetecnologiaparecemdoséculopassado?

.

Page 156: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO19

Sequisermosarmazenarmuitascontasnamemória,podemosfazerousodearrays,oqualjáestudamosnoscapítulosanteriores.Arraysnospossibilitamguardarumaquantidadedeelementosedepoisacessá-losdeformafácil.

Masoproblemaéquemanipularumarraynãoéfácil.Porexemplo,imagineumarraycom5contasguardadas. Se quisermos remover a posição 1, como fazemos? Pois, se apagarmos, precisaremosreordenartodonossoarray.Eparainserirumelementonomeiodoarray?Precisamos"abrirumburaco"noarray,empurrandoelementosprabaixo,paraaísimcolocaronovoelementonomeio.

Pararesolverosproblemasdoarray,podemostrabalharcomumaclassedoC#chamadaList.Parautilizarmos uma lista dentro do código precisamos informar qual é o tipo de elemento que a listaarmazenará:

//criaumalistaquearmazenaotipoContaList<Conta>lista=newList<Conta>();

Damesma forma que criamos a lista de contas, também poderíamos criar uma lista de númerosinteirosoudequalqueroutrotipodoC#.EssalistadoC#armazenaseuselementosdentrodeumarray.

TRABALHANDOCOMLISTAS

19.1 FACILITANDO O TRABALHO COM COLEÇÕES ATRAVÉS DASLISTAS

.

Page 157: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Agora que instanciamos o List , podemos utilizar o método Add para armazenar novoselementos:

Contac1=newContaCorrente();Contac2=newContaPoupanca();Contac3=newContaCorrente();

//c1ficanaposição0lista.Add(c1);//c2na1lista.Add(c2);//ec3na2lista.Add(c3);

SequisermospegaressaConta,podemosacessá-lapelasuaposição(nocaso,0,igualnoarray):

Contaconta=lista[0];

Sequisermosremoverumadascontasdalista,podemosusarométodoRemoveouRemoveAt:

//Alistacomeçadaseguinteforma:[c1,c2,c3]//DepoisdoRemove,elaterminadaseguinteforma:[c1,c3]//Acontac1continuanaposição0ec3vaiparaaposição1lista.Remove(c2);//removepeloelemento

//Depoisdessachamada,c3ocupaaposição0:[c3]lista.RemoveAt(0);//removepeloíndice

Se quisermos saber quantos elementos existem em nosso List, podemos simplesmente ler apropriedadeCount:

varc1=newContaCorrente();varc2=newContaInvestimento();

lista.Add(c1);lista.Add(c2);

intqtdDeElementos=lista.Count;

Tambémpodemosdescobrirseumelementoestádentrodeumalista:

Contac1=newContaCorrente();Contac2=newContaPoupanca();

lista.Add(c1);

booltemC1=lista.Contains(c1);//truebooltemC2=lista.Contains(c2);//false

UmoutrorecursoqueaclasseListnosforneceéaiteraçãoemcadaumdosseuselementos:

Contac1=newContaCorrente();Contac2=newContaPoupanca();

lista.Add(c1);lista.Add(c2);

foreach(Contacinlista){MessageBox.Show(c.ToString());

.

Page 158: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}

VejacomolidarcomcoleçõesdeelementosficoumuitomaisfácilcomaclasseList!

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

1. ComodescobrimosaquantidadedeelementosarmazenadoemumList?

varlista=newList<Conta>();lista.Add(...);lista.Add(...);lista.Add(...);

lista.Size

lista.Count()

lista.Size()

lista.Count

lista.GetTotal()

2. Qualométodoqueremoveumelementodalistapelasuaposição?

lista.Remove(posicao);

lista.RemoveAt(posicao);

lista.DeleteFrom(posicao);

lista.DeleteAt(posicao);

3. AclasseListimplementaumainterfacemaisgenéricadelistas.Qualé?

EditoraCasadoCódigocomlivrosdeumaformadiferente

19.2EXERCÍCIOS

.

Page 159: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Você pode consultar a documentação da classe no próprio site da Microsoft:http://msdn.microsoft.com/pt-br/library/6sh2ey19.aspx

IList

Nenhuma

List

GenericList

4. Vamosmodificarocódigodoprojetodobancoparautilizarlistasaoinvésdearraysparaguardarascontascadastradas.

Inicialmentesubstituaadeclaraçãodoatributoqueguardaareferênciaparaoarraydecontaspeladeclaraçãodeumalistadecontas.ApaguetambémadeclaraçãodoatributonumeroDeContas:

//Essadeclaraçãoseráutilizadanolugardoarray//decontasprivateList<Conta>contas;

ModifiqueométodoForm1_LoadparaqueeleinstancieumList<Conta>aoinvésdeumarraydecontas:

privatevoidForm1_Load(objectsender,EventArgse){this.contas=newList<Conta>();

//orestodométodocontinuaigual}

Porfim,modificaremosométodoAdicionaContadoformulárioprincipal:

publicvoidAdicionaConta(Contaconta){this.contas.Add(conta);comboContas.Items.Add(conta);}

Depoisdessasmodificações,testeaaplicação.

.

Page 160: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO20

Agora estamos interessados em melhorar o cadastro de contas que implementamos nos capítulosanteriores.O banco não quer aceitar o cadastro de contas cujo titular seja devedor, então dentro dosistemaprecisamosguardarumalistacomnomesdosdevedores:

List<string>devedores=newList<string>();

devedores.Add("victor");devedores.Add("osni");

Agoranocadastroprecisamosverificarseonomequefoidigitadonoformulárioestádentrodessalista.PodemosfazerissoutilizandoométodoContainsdaclasseList:

stringtitular=//lêocampotitulardocadastroboolehDevedor=devedores.Contains(titular);

MasaimplementaçãodoContainsdalistaprecisapercorrertodososnomescadastradosparasóentãodevolverseoelementoestáounãodentrodalista.Dessaforma,dependendodotamanhodalista,essabuscapodeficardemorada.

Como vimos, as listas não são muito otimizadas para as operações de buscas, pois além depermitiremarepetiçãodeelementos(queprejudicaodesempenhodabusca),precisampercorrertodososelementosparaimplementaremaoperaçãoContains.

Quandoprecisamosqueaoperaçãodebuscasejarápida,utilizamososconjuntosdoC#aoinvésdaslistas.Conjuntossãoestruturasnasquaispodemosfazerbuscasrápidasequenãopermitemrepetiçãodeelementos.

UmdostiposdeconjuntosdisponíveisnoC#éaclasseHashSet.Parabuscardemaneirarápida,oHashSet"categoriza"osseuselementos,deformaaencontrá-losrapidamente.Porexemplo,imaginevocê em um supermercado. Se você quer comprar sorvete, você não olha todos os itens dosupermercado,massimvaidiretoparaaseçãodecongelados.Lá,vocêprocuraoseusorvetefavorito.Vejaquevocêolhoumuitomenoselementos,pois foidiretoparaacategoriadele.OHashSet faz amesmacoisa.Eledá"categorias"paracadaumdoselementos,equandobuscaporeles,vaidiretoparaacategoria.

LIDANDOCOMCONJUNTOS

20.1OTIMIZANDOABUSCAATRAVÉSDECONJUNTOS

.

Page 161: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

AcategoriaédadaapartirdométodoGetHashCode()quevemherdadodaclasseObjectdoC#.Essemétododevolveumnúmerointeiroquerepresentaqualéacategoriadoobjeto.

CUIDADOSAOSOBRESCREVEROGETHASHCODE

Quando sobrescrevemos o método Equals de uma classe é uma boa prática tambémsobrescrevermos o método GetHashCode . Além disso, para que o HashSet funcionecorretamente,aimplementaçãodoGetHashCodedeveobedeceràseguinteregra:

Setivermosdoisobjetos,objeto1eobjeto2,comobjeto1.Equals(objeto2)devolvendoovalortrue,entãoosmétodosGetHashCodedoobjeto1edoobjeto2devemdevolveromesmovalor.Ouseja,objetosiguaisdevemserdamesmacategoria.

Umdetalheinteressantedosconjuntoséquevocêpodeadicionar,removereatémesmoverificarseum elemento está lá.Mas diferentemente da lista, você não consegue pegar um elemento randômiconela.Porexemplo,conjunto[10]nãofunciona!Eissofazsentido:nãoexisteordememumconjunto.

HashSet<string>devedores=newHashSet<string>();//PodemosadicionarelementosnoconjuntoutilizandoométodoAdddevedores.Add("victor");devedores.Add("osni");

//Parasabermosonúmerodeelementosadicionados,utilizamosapropriedade//Countdoconjunto.Nesseexemploelementosguardaráovalor2intelementos=devedores.Count;

//Oconjuntonãoguardaelementosrepetidos,entãosetentarmos//adicionarnovamenteastring"victor",onúmerodeelementos//continuasendo2devedores.Add("victor");

//Paraperguntarmosseoconjuntopossuiumdeterminadoelemento,//utilizamosométodoContainsboolcontem=devedores.Contains("osni");

.

Page 162: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

//Nãopodemospegarumelementopelasuaposição,poisoselementosdo//conjuntonãopossuemumaordenaçãobemdeterminada.Ocódigoabaixo//geraumerrodecompilação:devedores[0];

ParaiterarmosnoselementosdeumHashSet,podemosutilizarnovamenteocomandoforeach:

foreach(stringdevedorindevedores){MessageBox.Show(devedor);}

Quandoexecutamosoforeach emumHashSet, aordememqueos elementos são iterados éindefinida.

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

Emmuitasaplicaçõesalémdabuscarápida,tambémprecisamosmanteraordenaçãodoselementosde um conjunto. Nesse tipo de aplicação, podemos utilizar uma nova classe do C# chamadaSortedSet.

OSortedSet funciona de forma similar ao HashSet, utilizamos o Add para adicionar umelemento, o Remove para remover itens, o Count para perguntar quantos elementos estãoarmazenadoseContainsparaverificarseumdeterminadoelementoestánoconjunto.AdiferençaéquenoHashSetoselementossãoespalhadosemcategoriaseporissonãosabemosqualéaordemdaiteração,jáoSortedSetguardaoselementosnaordemcrescente.Entãonoexemplodoconjuntodedevedores,teríamosumconjuntoemqueoselementosestãoemordemalfabética:

SortedSet<string>devedores=newSortedSet<string>();

devedores.Add("Hugo");devedores.Add("Ettore");devedores.Add("Osni");

JáconheceoscursosonlineAlura?

20.2CONJUNTOSORDENADOSCOMOSORTEDSET

.

Page 163: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

devedores.Add("Alberto");devedores.Add("Victor");

//Esseforeachvaimostrarosnomesnaseguinteordem://Alberto,Ettore,Hugo,OsnieporfimVictorforeach(stringnomeindevedores){MessageBox.Show(nome);}

VimosquetemosduasclassesquerepresentamconjuntosnoC#,oHashSeteoSortedSet,emambasasclasses,quandoqueremosarmazenarumelementoutilizamosométodoAdd,pararemoveroRemove,parabuscaroContains epara saberonúmerodeelementosoCount, por essemotivo,existe uma interface que declara todos os comportamentos comuns aos conjunto que é a interfaceISet.

Vimosqueaslistaseosconjuntossãoduasestruturasqueexpõemmuitosmétodosemcomum,masquetambémpossuemdiversasdiferenças:

Naslistasoselementossãoarmazenadosnaordemdeinserçãoenquantocadaconjuntoarmazenaoselementosnaordemquedesejarparaotimizarotempodebusca;Listasaceitamrepetiçõesenquantoosconjuntosnão;Podemosacessarelementosdeumalistaatravésdeseuíndice,umaoperaçãoquenãofazsentidonoconjunto..

Comolistaseconjuntospossuemmuitasoperaçõesemcomum,tantoaslistasquantoosconjuntosimplementamumaoutrainterfacedoC#chamadaICollection:

20.3AINTERFACEDETODOSOSCONJUNTOS

20.4COMPARAÇÃOENTRELISTASECONJUNTOS

.

Page 164: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Além disso, aprendemos que podemos utilizar o foreach com qualquer coleção do C#. Issoaconteceporqueoforeachaceitaqualquerclasseque implementea interfaceIEnumerable, que éumasuperinterface(interfacepai)daICollection:

.

Page 165: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

1. Qualasaídadoprogramaaseguir?

varconjunto=newHashSet<Conta>();varc1=newContaCorrente();conjunto.Add(c1);conjunto.Add(c1);MessageBox.Show(conjunto.Count.ToString());

0

1

UmSetnãopossuipropriedadeCount

2

2. Comoeliminartodososelementosdeumconjunto?

varconjunto=newHashSet<Conta>();conjunto.????();

.Clear()

.DeleteAll()

.Reset()

.Empty()

3. NoBanco,nãopodemoscriarnovascontasparaclientesquesãodevedores,entãonateladecadastrodenovaconta,antesdecriarmosanovacontaqueseráadicionadanaaplicaçãoprecisamosverificarseelaestáemumalistadedevedoresquecontém30000nomes.

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

20.5EXERCÍCIOS

.

Page 166: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Adicionenoprojetoumanovapasta chamadaBusca e dentrodessapasta crieumanova classechamadaGeradorDeDevedorescomoseguintecódigo:

namespaceBanco.Busca{publicclassGeradorDeDevedores{publicList<string>GeraList(){List<string>nomes=newList<string>();for(inti=0;i<30000;i++){nomes.Add("devedor"+i);}returnnomes;}}}

Essaéaclassequeseráresponsávelporgeraralistadedevedoresqueutilizaremosnaaplicação.

No construtor do formulário de cadastro, classe FormCadastroConta , vamos utilizar oGeradorDeDevedoresparainicializaralistadedevedores:

publicpartialclassFormCadastroConta:Form{privateICollection<string>devedores;

privateForm1formPrincipal;

publicFormCadastroConta(Form1formPrincipal){this.formPrincipal=formPrincipal;InitializeComponent();

GeradorDeDevedoresgerador=newGeradorDeDevedores();this.devedores=gerador.GeraList();}

//Restodaclassecontinuaigual}

Agoranaaçãodobotãodecadastro,antesdecriarmosaconta,precisamosverificarseotitulardessanovacontaédevedor:

privatevoidbotaoCadastro_Click(objectsender,EventArgse){stringtitular=textoTitular.Text;boolehDevedor=this.devedores.Contains(titular);if(!ehDevedor){//fazalógicaparacriaraconta}else{MessageBox.Show("devedor");}}

.

Page 167: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

4. Paraverificarmosadiferençaentreo tempodebuscade listas e conjuntos, vamos repetir abusca30000vezesdentrodeumloop:

privatevoidbotaoCadastro_Click(objectsender,EventArgse){stringtitular=this.textoTitular.Text;boolehDevedor=false;for(inti=0;i<30000;i++){ehDevedor=this.devedores.Contains(titular);}if(!ehDevedor){//fazalógicaparacriaraconta}else{MessageBox.Show("devedor");}}

Enquantoocódigoestáexecutando,tentemoverajanela.Oqueaconteceu?

5. AgoramodifiqueoGeradorDeDevedoresparaqueeleutilizeumHashSetaoinvésdeumList:

publicHashSet<string>GeraList(){HashSet<string>nomes=newHashSet<string>();for(inti=0;i<30000;i++){nomes.Add("devedor"+i);}returnnomes;}

Repare que, para utilizarmos o HashSet, precisamosmudar os tipos do objeto instanciado, davariável e do retorno no método. O que podemos fazer para evitar tantas mudanças quandoqueremostrocaraimplementaçãodecoleçãoqueusamos?

6. Testenovamenteocadastrodacontaevejaquedessavezabuscaémaisrápida.7. ExperimentetambémoutrascoleçõesnométodoGeraList.

Noprojetodobanco,temosdiversascontascadastradaseagoraqueremoscriarumanovabuscadecontapornomedotitular.Paraimplementaressabusca,podemositerarnalistadecontasecompararonomedotitulardecadaumadessascontas:

IList<Conta>contas=//pegaascontascadastradasstringtitularDaBusca="victor";Contaresultado=null;foreach(Contacontaincontas){if(conta.Titular.Nome.Equals(titularDaBusca)){

20.6BUSCASRÁPIDASUTILIZANDODICIONÁRIOS

.

Page 168: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

resultado=conta;break;}}

Agora repare que em todoponto do código emque precisamos buscar uma conta pelo nomedotitular, precisamos repetir esse bloco de código, além disso, essa busca passa por todas as contascadastradasnosistema,oquepodedemorarbastante.Pararesolveresseproblemadeformaeficiente,oC#nosofereceosDicionários(Dictionary).

ODictionaryéumaclassequeconsegueassociarumachaveaumvalor.Utilizandoodicionário,podemos,porexemplo,associaronomedotitularcomumacontadosistema.Quandovamosconstruirumdicionáriodentrodocódigo,precisamosinformarqualéotipodachaveequalseráotipodovalorassociado a essa chave, para implementarmos a buscade contas, precisaríamosdeumdicionárioqueassociaumachavedotipostringcomumaConta.

Dictionary<String,Conta>dicionario=newDictionary<String,Conta>();

Agoraparacolocarmosumvalornodicionário,utilizamosométodoAdd:

Dictionary<String,Conta>dicionario=newDictionary<String,Conta>();Contaconta=//inicializaaconta

//vamosadicionaracontanodicionário//associaonomedotitularcomaconta.dicionario.Add(conta.Titular.Nome,conta);

Depoisqueinicializamosodicionário,podemosrealizarbuscasdevaloresutilizandoaschavesqueforamcadastradas.Vamos,porexemplo,buscaracontadeumtitularchamado"Victor":

Contabusca=dicionario["Victor"];

Veja que utilizando dicionários a busca por nomes ficou muito mais simples do que a buscautilizandooforeach,alémdisso,asbuscascomdicionáriossãotãorápidasquantobuscasutilizandoconjuntos,ouseja,muitomaiseficientesdoqueonossoforeachinicial.

Alémde fazermosbuscas rápidas, podemos também iterarnos elementosque estão armazenados,para isso tambémutilizamosoforeach doC#.Porémqual será o tipoqueutilizaremosdentrodoforeach?

Ao iterarmos em um dicionário, o tipo utilizado dentro do foreach é um tipo que consegueguardarumparde chave associado aumvalordodicionário (KeyValuePair). Logo,no códigodoforeachotiposeriaKeyValuePair<tipodachave,tipodovalor>:

Dictionary<string,Conta>dicionario=newDictionary<string,Conta>();//preencheodicionário

foreach(KeyValuePair<string,Conta>parindicionario)

20.7ITERANDONODICIONÁRIO

.

Page 169: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

{//podemosacessarachaveatualdodicionáriostringchave=par.Key;

//epodemospegarovalorassociadoàchaveContavalor=par.Value;}

Assim como no HashSet, quando iteramos em um dicionário, seus elementos não estão emnenhuma ordem em particular, logo não podemos depender da ordem dos elementos do dicionário.Quando estamos trabalhando com um algoritmo que depende da ordem dos elementos, precisamosutilizarumoutro tipodedicionáriochamadoSortedDictionary.OusodoSortedDictionary éigual ao do Dictionary, porém seus elementos estão sempre na ordem crescente das chaves dodicionário.

No C#, temos uma interface implementada por todos os tipos os tipos de dicionários, aIDictionary, além disso, os dicionários também implementam a interface ICollection do C#,porémelessãocoleçõesdeKeyValuePair.Podemosversuahierarquianaimagemaseguir:

AhierarquiadascoleçõesdoC#ficadaseguinteforma:

.

Page 170: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

1. Em nosso banco, precisamos implementar uma nova busca de contas por nome do titular. Paraimplementarmosessabusca,utilizaremososdicionáriosdoC#.

Noformulárioprincipaldaaplicação,coloqueumnovocampodetextoquereceberáqualéonomedotitulardabusca.ChameessecampodetextoBuscaTitular.Alémdessenovocampodetexto,coloquetambémumnovobotãoquequandoclicadoexecutaráabuscapornome,chameessebotãodebotaoBusca.Oseuformuláriodeveficarparecidocomoquesegue:

Seuslivrosdetecnologiaparecemdoséculopassado?

20.8EXERCÍCIOS

.

Page 171: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Paraimplementarmosessabuscapornomedetitular,oformulárioprecisadeumnovoatributodotipoDictionary.Quaisdevemserostiposdachaveedovalordodicionário?Agoraquetemosodicionário,todavezquecriamosumanovaconta,precisamosadicioná-laàlistadecontas,nocomboboxenodicionáriodecontas,mascomooformuláriopossuiummétodoespecializadoemadicionarnovascontas,oAdicionaConta,sóprecisamosmodificaraimplementaçãodessemétodo.Reparequecomoocódigoestáencapsulado,precisamosapenasmodificaressemétodoquetudofuncionaráautomaticamente.

publicpartialclassForm1:Form{privateDictionary<string,Conta>dicionario;

privatevoidForm1_Load(objectsender,EventArgse){this.dicionario=newDictionary<string,Conta>();

//restodométodo}

publicvoidAdicionaConta(Contaconta){contas.Add(conta);comboContas.Items.Add(conta);

//agorasóprecisamosatualizarodicionáriothis.dicionario.Add(conta.Titular.Nome,conta);}

//Restodocódigodaclasse}

Agora que já preparamos o dicionário, precisamos apenas utilizá-lo para implementar a ação dobotãodebuscaportitular.

.

Page 172: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

privatevoidbotaoBusca_Click(objectsender,EventArgse){//Precisamosprimeirobuscarqualéonomedotitularquefoidigitado//nocampodetextostringnomeTitular=textoBuscaTitular.Text;

//Agoravamosusarodicionárioparafazerabusca.//ReparecomoocódigodebuscaficasimplesContaconta=dicionario[nomeTitular];

//EagorasóprecisamosmostraracontaquefoiencontradanabuscatextoTitular.Text=conta.Titular.Nome;textoNumero.Text=Convert.ToString(conta.Numero);textoSaldo.Text=Convert.ToString(conta.Saldo);}

2. (Opcional)Nocódigodoexercíciopassado,quandoencontramosumacontadentrododicionário,estamos apenas atualizando as informações que são mostradas nos campos textoNumero ,textoSaldoetextoTitular,porémquandotentamosfazerumaoperação,sempreutilizamosoitemqueestáselecionadoatualmentenocomboContas.PrecisamosutilizaracontadevolvidapelodicionárioparaatualizarovalorselecionadodocomboContas,parafazerisso,precisamosapenasatribuiracontaquequeremosselecionarnapropriedadeSelectedIndexdocomboContas:

privatevoidbotaoBusca_Click(objectsender,EventArgse){stringnomeTitular=textoBuscaTitular.Text;Contaconta=dicionario[nomeTitular];

//AgoravamosatualizaroitemselecionadodocomboContas:comboContas.SelectedItem=conta;}

QuandoescrevemosnapropriedadeSelectedItem,oWindowsFormsautomaticamentechamaaaçãodemudançade itemselecionadodocombobox(ocomboContas_SelectedIndexChanged),logonãoprecisamosnospreocuparematualizaroscamposdetextonocódigodabuscapornomedotitular.

3. O que acontece quando tentamos buscar um nome de titular que não existe? Tentemodificar ocódigodoformulárioparacorrigiroproblema.

.

Page 173: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO21

Nossobancoarmazenaumalistadecontas.Essascontaspossuemosmaisvariadoscorrentistas,saldosetipos.Muitas vezes, precisamos filtrá-las de alguma forma.Por exemplo, se quisermospegar todas ascontascomsaldomaiorque2000reais,fazemos:

varlista=newList<Conta>();

//inserimosalgumascontaslista.Add(...);

//crialistaqueusaremosparaguardaroselementosfiltradosvarfiltrados=newList<Conta>();foreach(varc:lista){if(c.Saldo>2000){filtrados.Add(c);}}

//agoraavariavel"filtrados"temascontasquequeremos!

Secomplicarmosaindamaisofiltro(porexemplo,contascomsaldomaiorque2000emenorque5000,comdatadeaberturaentreosanos2010e2012,...),nossocódigoficarátambémmaiscomplexo,alémdisso,sequiséssemosaplicarumfiltroemumalistacomoutrotipodeobjeto,teríamosquerepetirnovamenteocódigodoforeachemdiversospontosdaaplicação.

Parafiltrarumalista,seriamuitomaisinteressantequeaprópriacoleçãotivessealgummétodoquerecebesseacondiçãoquequeremosaplicarnessefiltroe já implementassea lógicadoforeach, algocomo:

List<Conta>contas=//inicializaalista

varfiltradas=contas.Filtra(condição);

Mascomopassaracondiçãoparaessefiltro?Teríamosqueenviarumblocodecódigoqueaceitaourejeitaosvaloresdacoleção.Parapassarumblocodecódigoquepodeserutilizadoporummétodo,oC# introduziu as funções anônimas ou lambdas. As funções anônimas funcionam como métodosestáticosdalinguagemcomumadeclaraçãosimplificada.ParadeclararumafunçãoanônimaquerecebeumargumentodotipoContautilizamososeguintecódigo:

LINQELAMBDA

21.1FILTROSUTILIZANDOOLINQ

.

Page 174: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

(Contac)=>{//implementaçãodafunçãoanônima}

Dentrodoblocodeimplementaçãodafunçãoanônima,colocaremosaimplementaçãodacondição:

(Contac)=>{returnc.Saldo>2000;}

EagoraessafunçãopodeserpassadaparadentrodométodoFiltra:

contas.Filtra((Contac)=>{returnc.Saldo>2000;});

NoC#temosexatamenteaimplementaçãodessaideia,masométodosechamaWhereaoinvésdeFiltra.Então,parabuscarmostodasascontasquetêmumsaldomaiordoque2000,utilizaríamososeguintecódigo:

List<Conta>contas=//inicializaalistavarfiltradas=contas.Where((Contac)=>{returnc.Saldo>2000;});

Agoraquetemosalistadecontasfiltradas,podemos,porexemplo,iterarnessalista:

foreach(Contacontainfiltradas){MessageBox.Show(conta.Titular.Nome);}

AbibliotecadoC#quedefineométodoWhereéchamadaLINQ,aLanguageIntegratedQuery.

Editorastradicionaispoucoligamparaebooksenovastecnologias.Nãodominamtecnicamente o assunto para revisar os livros a fundo. Não têm anos deexperiênciaemdidáticascomcursos.ConheçaaCasadoCódigo,umaeditoradiferente,comcuradoriadaCaelum eobsessãoporlivrosdequalidadeapreçosjustos.

CasadoCódigo,ebookcompreçodeebook.

Veja que, no códigodo lambdaquepassamos comoargumentoparaoWhere, definimosqueoargumentodafunçãoanônimaédotipoContaporquealistadavariávelcontasédotipoConta.Reparequeotipodoargumentodolambdanaverdadeéredundanteeporisso,desnecessário:

varfiltradas=contas.Where(c=>{returnc.Saldo>2000;});

Alémdisso,quandodeclaramosuma funçãoanônimaque temapenasuma linhaquedevolveum

EditoraCasadoCódigocomlivrosdeumaformadiferente

21.2SIMPLIFICANDOADECLARAÇÃODOLAMBDA

.

Page 175: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

valor,podemosremoverinclusiveaschaveseoreturndadeclaraçãodolambda:

varfiltradas=contas.Where(c=>c.Saldo>2000);

Vejaqueesse código final émuitomais simplesdoqueadeclaração inicialqueutilizamosparaafunçãoanônima.

Agoraimaginequequeremossaberqualéasomadosaldodetodasascontasqueestãocadastradasdentrodaaplicação.Pararesolveresseproblema,teríamosquefazerumcódigoparecidocomoseguinte:

List<Conta>contas=//inicializaalistadecontasdoubletotal=0.0;

foreach(Contacincontas){total+=c.Saldo;}

Porém esse tipo de código também acaba ficando repetitivo.Quando queremos fazer a somadoselementosdeumalista,podemosutilizarométodoSumdoLINQ,passandoumlambdaquefalaqualéapropriedadedacontaquequeremossomar:

doubletotal=contas.Sum(c=>c.Saldo);

Com essa linha de código conseguimos omesmo efeito do foreach anterior. Além do Sum,tambémpodemosutilizar ométodoAverage para calcular amédiados valores,Count para contar onúmerodevaloresqueobedecemalgumcritério,MinparacalcularomenorvaloreMaxparacalcularomaiorvalor:

List<Conta>contas=//inicializaalista

//somadossaldosdetodasascontasdoublesaldoTotal=contas.Sum(c=>c.Saldo);

//mediadosaldodascontasdoublemediaDosSaldos=contas.Average(c=>c.Saldo);

//númerodecontasquepossuemNumeromenordoque1000intnumero=contas.Count(c=>c.Numero<1000);

intmenorNumero=contas.Min(c=>c.Numero);

doublemaiorSaldo=contas.Max(c=>c.Saldo);

Quandoutilizamosessesmétodosdeagregaçãoemumalistacomtiposprimitivos,olambdaéumargumentoopcional.Porexemplo,setivéssemosumalistadedouble,poderíamosutilizaroseguintecódigoparacalcularamédiadosnúmeros:

List<double>saldos=//inicializaalista

doublemedia=saldos.Average();

21.3OUTROSMÉTODOSDOLINQ

.

Page 176: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

OLINQ, alémde trabalhar com listas, tambémpode ser utilizados comoutros tipos de coleções,podemosutilizaroLINQcomqualquerobjetoqueimplementeainterfaceIEnumerable,ouseja,elepode serutilizadocomqualquerobjetoquepossa serpassadoparaa instruçãoforeach. Isso incluitodosostiposdecoleções(Listas,conjuntosedicionários)earrays.

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

VimosqueutilizandooLINQpodemos fazer filtroseagregaçõesdeumaformafácilemqualquercoleçãodoC#,porémquandoprecisamosfazerumfiltrocomplexo,olambdapodeficarcomumcódigocomplexo.Eporisso,aMicrosoftdecidiufacilitaraindamaisousodoLINQ.

Para implementarmosum filtro, emvezdeutilizarmosométodoWhere, podemosutilizarumasintaxequefoibaseadanalinguagemdebuscaembancodedados,aSQL.Paracomeçarmosumfiltroutilizandoessanovasintaxe,precisamoscomeçarofiltrocomapalavrafromcriandoumavariávelqueseráutilizadaparanavegarnalista:

varfiltradas=fromcincontas

Agora para colocarmos uma condição nesse filtro, utilizamos a palavrawhere passando qual é acondiçãoaqueacontadeveobedecerparaaparecercomoresultadodessefiltro:

varfiltradas=fromcincontaswherec.Numero<2000

Eporfim,precisamosapenasinformaroqueseráselecionadoutilizandooselect:

varfiltradas=fromcincontaswherec.Numero<2000selectc;

21.4UTILIZANDOOLINQCOMOUTROSTIPOS

JáconheceoscursosonlineAlura?

21.5MELHORANDOASBUSCASUTILIZANDOASINTAXEDEQUERIES

.

Page 177: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Com esse código, estamos definindo um filtro que devolverá apenas as contas que têm númeromenordoque2000.

Quandoo compiladorda linguagemC#encontrao filtroquedefinimos, esse código é convertidoparaumachamadaparaométodoWherequevimosanteriormente.Essanovasintaxeéapenasumjeitodeesconderacomplexidadedolambda.

Muitasvezes,quandoestamosusandooLINQ,ofiltronãoprecisaretornartodasasinformaçõesdosobjetosdalistaqueestásendoprocessada.Podemosestarinteressadosembuscarapenasonúmerodascontasqueobedecemoscritériosdabusca,paraissoprecisamosapenasmudaroselectdoLINQ.

List<Conta>contas=//inicializaalista

varresultado=fromcincontaswhere<condiçãodabusca>selectc.Numero;

Oresultadodessabuscaseráumacoleçãodenúmerosinteiros.

Mas e quando queremos devolver mais atributos da conta? Como no LINQ podemos apenasdevolverumobjetocomoresultadodaquery,teríamosquecriarumaclassequecontémosatributosqueserãodevolvidospelaquery,masmuitasvezesnósfazemosabuscaeutilizamosoresultadodentrodeumúnico ponto da aplicação (dentro de ummétodo, por exemplo).Nesses casos, podemos deixar ocompiladordoC#cuidardacriaçãodesseobjetoanônimo:

varresultado=fromcincontaswhere<condiçãodabusca>selectnew{c.Numero,c.Titular};

Nessecódigo,ocompiladordoC#criaumnovotipoqueseráutilizadoparaguardaroresultadodabusca. Esse tipo não possui umnome dentro do código e por isso o objeto devolvido é chamado deObjetoAnônimo.QuandoutilizamosoobjetoanônimonoLINQ,somosforçadosautilizarainferênciadetipos(palavravar).

No exemplo, o objeto anônimo devolvido pelo compilador possui as propriedades Titular eNumero,portantopodemosutilizá-lasdentrodeumforeach:

foreach(varcinfiltradas){//aquidentropodemosapenasusaroTitulareoNumero,//setentarmosacessaroSaldoteremosumerrodecompilaçãoMessageBox.Show(c.Titular.Nome+""+c.Numero);}

1. CrieumnovoformuláriochamadoFormRelatorios.Utilizá-lo-emosparamostraroresultadodequeriesfeitasutilizandooLINQ.

21.6PARASABERMAIS—PROJEÇÕESEOBJETOSANÔNIMOS

21.7EXERCÍCIOS

.

Page 178: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

No editor gráfico desse novo formulário, abra a janela Toolbox e adicione o componenteListBox,chame-odelistaResultado.UtilizaremosesseListBoxparamostrarosresultadosdevolvidospeloLINQ.

Agora vamos criar nosso primeiro relatório, o de busca de contas com saldomaior do que 5000,atravésdeumnovobotãodentrodajanela.UtilizeonomebotaoFiltroSaldo:

Quandoessebotãoforclicado,queremosexecutarumfiltrocomoLINQ:

privatevoidbotaoFiltroSaldo_Click(objectsender,EventArgse){//Aquiimplementaremosofiltro}

Comoosrelatóriosprecisarãodalistadecontas,pediremosessalistanoconstrutordajanela:

publicpartialclassFormRelatorios:Form{privateList<Conta>contas;publicFormRelatorios(List<Conta>contas){InitializeComponent();this.contas=contas;}//outrosmétodosdajanela.}

Dentrodaaçãodobotão,implementeabuscaportodasascontasquepossuemsaldomaiordoque5000.AgorautilizaremosoListBoxparamostrarascontasdevolvidaspeloLINQ.

OListBoxfuncionacomooComboBox.Quandoqueremosadicionarumanovalinha,precisamosadicionaroobjetoquequeremosmostrardentrodapropriedadeItemsdoListBox.Elemostraráo ToString() do objeto adicionado. Como utilizaremos esse ListBox para mostrarmos oresultadodediversasbuscas,precisamoslimparoresultadoanteriorantesdemostraropróximo,efazemosissoatravésdométodoClear()dapropriedadeItems:

privatevoidbotaoFiltroSaldo_Click(objectsender,EventArgse){listaResultado.Items.Clear();

.

Page 179: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

varresultado=//querydoLINQforeach(varcinresultado){listaResultado.Items.Add(c);}}

Agorapara testarmosessabusca,vamosadicionarumnovobotãodentrodoformulárioprincipal,classe Form1 , chamado botaoRelatorio que instanciará o formulário FormRelatoriospassandoalistadecontascomoargumentoedepoischamaráoShowDialogparamostraressanovajanela:

privatevoidbotaoRelatorio_Click(objectsender,EventArgse){FormRelatoriosform=newFormRelatorios(this.contas);form.ShowDialog();}

2. Agora vamos implementar um novo relatório com o LINQ. Dessa vez, queremos listar todas ascontasantigas (numeromenordoque 10) com saldomaiordoque 1000.Para isso crieumnovobotãona janelade relatórios que quando clicado executará a query do LINQna lista de contas emostraoresultadodentrodoListBoxquecriamosnoexercícioanterior.

3. Agoravamoscolocar resumosdas informaçõescontidasno relatório.Para isso, colocardentrodorelatórioumnovoGroupBoxqueteráotítuloResumo.DentrodesseGroupBox,mostraremos,porexemplo,qualéosaldodacontademaiorSaldoequaléoSaldototaldetodasascontas.

Além desse GroupBox, coloque algumas 4 labels para mostrar os resumos desse relatório. OprimeirodevemostrarotextoSaldoTotal, o segundo, o textoMaiorSaldo.Osdois labelsrestantesserãoutilizadosparamostrarosresumos—chameoterceirolabeldelabelSaldoTotaleoúltimodelabelMaiorSaldo.Seuformuláriodeveficarparecidocomafiguraaseguir:

.

Page 180: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Depoisdemodificarmoso formulário, vamosmodificar as açõesdobotãoparaque elas, alémdefazerema busca, também atualizem o resumo com as informações da busca. Podemos extrair osresumosdaseguinteforma:

privatevoidbotaoFiltroSaldo_Click(objectsender,EventArgse){listaResultado.Items.Clear();varresultado=//querydoLINQforeach(varcinresultado){listaResultado.Items.Add(c);}doublesaldoTotal=resultado.Sum(conta=>conta.Saldo);doublemaiorSaldo=resultado.Max(conta=>conta.Saldo);

labelSaldoTotal.Text=Convert.ToString(saldoTotal);labelMaiorSaldo.Text=Convert.ToString(maiorSaldo);}

Experimente a API do LINQ, tentando criar novas queries e extrair outras informações para oresumodorelatório.

.

Page 181: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Querendoaprenderaindamaissobre?Esclarecerdúvidasdosexercícios?Ouvirexplicaçõesdetalhadascomuminstrutor?ACaelumofereceocursoFN-13 presencial nas cidades de São Paulo, Rio deJaneiroeBrasília,alémdeturmasincompany.

ConsulteasvantagensdocursoC#eOrientaçãoaObjetos

Alémde fazermosbuscaseprojeções,podemos tambémutilizaroLINQparaordenarcoleçõesdeelementos. Para isso precisamos apenas colocar um orderby dentro da query. Por exemplo, parabuscarmostodasascontascomsaldomaiordoque10000ordenadaspelonomedotitular,utilizamososeguintecódigo:

List<Conta>contas=//inicializaalistadecontasvarresultado=fromcincontaswherec.Saldo>10000orderbyc.Titular.Nomeselectc;

Com isso temos uma lista de contas ordenadas pelo nome do titular de forma ascendente(alfabética).Assimcomopodemos fazeraordenaçãoascendente, tambémpodemos fazeraordenaçãodescendenteutilizandoapalavradescending:

List<Conta>contas=//inicializaalistadecontasvarresultado=fromcincontaswherec.Saldo>10000orderbyc.Titular.Nomedescendingselectc;

Masesetivermosdoistitularescomexatamenteomesmonome?Nessecaso,podemosdefinirumsegundocritérioparadesempataraordenação.Cadaumdoscritériosdaordenação fica separadoporvírgulanoorderby.No exemplo, para desempatarmos a ordenação utilizando o número da conta,utilizamososeguintecódigo:

List<Conta>contas=//inicializaalistadecontasvarresultado=fromcincontaswherec.Saldo>10000orderbyc.Titular.Nomedescending,c.Numeroselectc;

Osegundocritériodeordenaçãotambémpodeteropcionalmenteapalavradescending:

VocêpodetambémfazerocursoFN-13dessaapostilanaCaelum

21.8ORDENANDOCOLEÇÕESCOMLINQ

.

Page 182: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

List<Conta>contas=//inicializaalistadecontasvarresultado=fromcincontaswherec.Saldo>10000orderbyc.Titular.Nomedescending,c.Numerodescendingselectc;

Assim comono casodo filtro, as ordenações doLINQ também são traduzidas para chamadas demétodopelo compilador doC#.Quando colocamos umorderby na busca, o compilador chama ométodoOrderBy(ouOrderByDescendingnocasodeumaordenaçãodescendente).Aquerycomofiltroeaordenaçãopelotitularficadaseguinteforma:

varresultado=contas.Where(c=>c.Saldo>10000).OrderBy(c=>c.Titular.Nome);

Quandocolocamosumaordenaçãosecundária,ocompiladordoC#chamaométodoThenBy(ouThenByDescendingnocasodeumaordenaçãosecundáriadescendente):

varresultado=contas.Where(c=>c.Saldo>10000).OrderBy(c=>c.Titular.Nome).ThenBy(c=>c.Numero);

1. Vamos adicionar uma ordenação na tela de relatórios. Faça com que os botões que geram osrelatóriosmostremascontasordenadaspelaordemalfabéticadonomedotitular.

2. (Opcional) Agora tente fazer a mesma ordenação do exercício passado utilizando o métodoOrderBydoLINQ.

3. (Opcional) Tente utilizar também uma ordenação secundária pelo número da conta em seusrelatórios.

21.9EXERCÍCIOS-ORDENAÇÃO

.

Page 183: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO22

AgoraquejávimosquepodemosutilizaroC#paradesenvolverumsistemaorientadoaobjetos,vamosaprendercomoutilizarasbibliotecasdoSystem.IOparalereescreverdadosemarquivos.

AentradadedadosnoC#funcionaemduasetapas.Naprimeiraetapa, temosumaclasseabstrataque representa uma sequência de bytes na qual podemos realizar operações de leitura e escrita. EssaclasseabstrataéchamadadeStream.

Como o Stream é uma classe abstrata, não podemos usá-la diretamente, precisamos de umaimplementação para essa classe. No caso de leitura ou escrita em arquivos, utilizamos um tipo deStream chamado FileStream, que pode ser obtido através dométodo estático Open da classeFile.QuandoutilizamosoOpen, devemospassar onomedo arquivoque será aberto e devemosinformá-looquequeremosfazercomoarquivo(lerouescrever).

Paraabrirmosoarquivoentrada.txtparaleitura,utilizamosocódigoaseguir:

Streamentrada=File.Open("entrada.txt",FileMode.Open);

AgoraquetemosoStream,podemoslerseupróximobyteutilizandoométodoReadByte.

byteb=entrada.ReadByte();

Porém, trabalhar combytesnãoé fácil,queremos trabalharcom textos!Portantovamosutilizarasegundapartedaleitura.

Para facilitar a leitura de Streams, o C# nos oferece uma classe chamada StreamReader ,responsável por ler caracteres ou strings de um Stream.OStreamReader precisa saber qual é aStreamqueserálida,portantopassaremosessainformaçãoatravésdeseuconstrutor:

StreamReaderleitor=newStreamReader(entrada);

Paralerumalinhadoarquivo,utilizamosométodoReadLinedoStreamReader:

stringlinha=leitor.ReadLine();

Enquanto o arquivo não terminar, ométodo ReadLine() devolve um valor diferente de nulo,portanto,podemoslertodasaslinhasdeumarquivocomoseguintecódigo:

SYSTEM.IO

22.1LEITURADEARQUIVOS

.

Page 184: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

stringlinha=leitor.ReadLine();while(linha!=null){MessageBox.Show(linha);linha=leitor.ReadLine();}

Assimqueterminamosdetrabalharcomoarquivo,devemossemprelembrardefecharoStreameoStreamReader:

leitor.Close();entrada.Close();

Ocódigocompletoparalerdeumarquivoficadaseguinteforma:

Streamentrada=File.Open("entrada.txt",FileMode.Open);StreamReaderleitor=newStreamReader(entrada);stringlinha=leitor.ReadLine();while(linha!=null){MessageBox.Show(linha);linha=leitor.ReadLine();}leitor.Close();entrada.Close();

Porém,oarquivopodenãoexistire,nessecaso,oC#lançaaFileNotFoundException.Devemos,portanto, verificar se o arquivo existe antes de abri-lo para leitura. Podemos verificar se um arquivoexisteutilizandoométodoExistsdaclasseFile:

if(File.Exists("entrada.txt")){//Aquitemoscertezaqueoarquivoexiste}

Ocódigodaleituracomaverificaçãoficaassim:

if(File.Exists("entrada.txt")){Streamentrada=File.Open("entrada.txt",FileMode.Open);StreamReaderleitor=newStreamReader(entrada);stringlinha=leitor.ReadLine();while(linha!=null){MessageBox.Show(linha);linha=leitor.ReadLine();}leitor.Close();entrada.Close();}

.

Page 185: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

LENDOTODOOCONTEÚDODEUMARQUIVO

Vimosqueparalertodasaslinhasdeumarquivo,precisamosutilizarométodoReadLineatéqueoretornosejaovalornull,masissoétrabalhoso.

Ao invés de chamar o método ReadLine para cada linha, podemos utilizar o métodoReadToEnddaclasseStreamReader.Essemétododevolveumastringcomtodooconteúdodoarquivo.

Conheça a Casa do Código, uma nova editora, com autores de destaque nomercado, foco em ebooks (PDF, epub, mobi), preços imbatíveis e assuntosatuais.Com a curadoria daCaelum e excelentes autores, é uma abordagemdiferenteparalivrosdetecnologianoBrasil.

CasadoCódigo,LivrosdeTecnologia.

Assimcomoa leitura, a escrita tambémaconteceemduasetapas.Naprimeiraetapa, trabalhamosnovamenteescrevendobytesparaasaída.ParaissoutilizaremosnovamenteaclasseabstrataStream.

Para escrevermos em um arquivo, precisamos primeiro abri-lo emmodo de escrita utilizando ométodoOpendoFilepassandoomodoFileMode.Create:

Streamsaida=File.Open("saida.txt",FileMode.Create);

Porém,nãoqueremostrabalharcomBytes,entãoutilizaremosumaclasseespecializadaemescreveremumStreamchamadaStreamWriter.

StreamWriterescritor=newStreamWriter(saida);

PodemosescreverumalinhacomoStreamWriterutilizandoométodoWriteLine:

escritor.WriteLine("minhamensagem");

Depoisqueterminamosdeutilizaroarquivo,precisamosfechartodososrecursos:

Seuslivrosdetecnologiaparecemdoséculopassado?

22.2ESCREVENDOEMARQUIVOS

.

Page 186: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

escritor.Close();saida.Close();

Ocódigocompletoparaescrevernoarquivoficadaseguinteforma:

Streamsaida=File.Open("saida.txt",FileMode.Create);StreamWriterescritor=newStreamWriter(saida);escritor.WriteLine("minhamensagem");escritor.Close();saida.Close();

Repareque,porusarmosumaclasseabstrata,podemosentãotrocarfacilmenteaclasseconcretaporoutra.Porexemplo,poderíamos lerdeumSocket,oudeumaporta serial, eocódigoseriaomesmo:bastaaclasseserfilhadeStream.Reparequeousodeclassesabstratasepolimorfismonospossibilitaler/escreveremdiferentes lugarescomomesmocódigo.VejaqueaprópriaMicrosoft fezbomusodeorientaçãoaobjetosparafacilitaravidadosdesenvolvedores.

OIOdoC#podeseresquematizadopelaseguintefigura:

ONDEOSARQUIVOSSÃOGRAVADOS

Quandopassamos apenasonomedo arquivono códigodoFile.Open, oC#procura essearquivodentrodapastaemqueaaplicaçãoéexecutada.NocasodeexecutarmosaaplicaçãopeloVisualStudio,apastautilizadapelaaplicaçãoseráapastaemqueoprojetofoicriado.

Toda vez que abrimos um arquivo dentro de um programaC#, precisamos fechá-lo utilizando ométodoClose.DevemosgarantirqueoClose seráexecutadomesmoquandoocódigo lançaumaexceçãodurantesuaexecução,paraissopodemosutilizaroblocofinally:

Streamarquivo=null;StreamReaderleitor=null;try{

22.3GERENCIANDOOSARQUIVOSCOMOUSING

.

Page 187: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

arquivo=File.Open("arquivo.txt",FileMode.Open);leitor=newStreamReader(arquivo);//utilizaoarquivo}catch(Exceptionex){//Executaotratamentodoerroqueaconteceu}finally{//fechaoarquivoeoleitor

//antesdefecharmos,precisamosverificarqueoarquivoeoleitorforam//realmentecriadoscomsucessoif(leitor!=null){leitor.Close();}if(arquivo!=null){arquivo.Close();}}

Vejaqueocódigoparalidarcorretamentecomosarquivospodeficarmuitocomplicado.Aoinvésdecuidarmosmanualmentedosarquivos,podemospedirparaalinguagemC#cuidardogerenciamentoutilizandooblocousing.

DentrodeumblocousingpodemosinstanciarumrecursoquequeremosquesejagerenciadopeloC#,comoporexemploumarquivo:

using(Streamarquivo=File.Open("arquivo.txt",FileMode.Open)){//oarquivosóficaabertodentrodessebloco.}//setentarmosutilizaroarquivoforadoblocousingteremosumerrodecompilação.

TambémpodemosutilizarousingparagerenciaroStreamReader:

using(Streamarquivo=File.Open("arquivo.txt",FileMode.Open))using(StreamReaderleitor=newStreamReader(arquivo)){//aquidentrovocêpodeutilizartantooleitorquantooarquivo}

Ousingautomaticamentefechaosarquivosutilizadosdentrodoblocomesmoquandoumaexceçãoélançadapelocódigo.

Podemos utilizar o bloco using para gerenciar qualquer classe que implemente a interfaceIDisposabledoC#.

1. Vamosagoracriarumpequenoeditordetextoparatrabalharmoscomarquivos.DentrodoVisualC#,crieumnovoprojetodotipoWindowsFormApplicationchamadoEditorDeTexto.Dentro

22.4EXERCÍCIOS

.

Page 188: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

desseprojeto,adicioneumTextBoxqueseráocampodetextoondeousuáriodigitaráotextoquedeve sergravadonoarquivo, chame-odetextoConteudo.Alémdesse campode texto, adicionetambém um botão que quando clicado gravará o campo de texto em um arquivo, chame-o debotaoGrava.

Para permitir que o usuário possa digitar diversas linhas no campo de texto, clique como botãodireitonoTextBoxeselecioneaopçãoProperties.DentrodajanelaProperties,encontreapropriedadechamadaMultilineemudeseuvalorparatrue.AgoraestiqueoTextBoxparaqueoseuformuláriofiqueparecidocomodaimagem:

Agoraquetemosoformuláriopronto,façacomqueocarregamentodoprogramapreenchaocampodetextodo formuláriocomoconteúdodeumarquivochamadotexto.txt.Não se esqueçadeverificarqueoarquivoexisteantesdeabri-lo

privatevoidForm1_Load(objectsender,EventArgse){if(File.Exists("texto.txt")){Streamentrada=File.Open("texto.txt",FileMode.Open);StreamReaderleitor=newStreamReader(entrada);stringlinha=leitor.ReadLine();while(linha!=null){textoConteudo.Text+=linha;linha=leitor.ReadLine();}leitor.Close();entrada.Close();}}

2. Implemente a ação do botão Gravar. Quando clicado, esse botão deve gravar o conteúdo doTextBoxdentrodeumarquivochamadotexto.txt:

.

Page 189: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

privatevoidbotaoGrava_Click(objectsender,EventArgse){Streamsaida=File.Open("texto.txt",FileMode.Create);StreamWriterescritor=newStreamWriter(saida);escritor.Write(textoConteudo.Text);escritor.Close();saida.Close();}

3. ExisteummétododentrodaclasseStreamReaderchamadoReadToEndquelêtodasaslinhasdoarquivo.Modifiqueoeditorparautilizaressemétodo.

4. Modifiqueocódigodoeditordetextoparaqueeleutilizeousingparafecharosarquivos.

5. (Opcional)Quandoqueremosumprogramaque trabalha como terminaldo sistemaoperacional,precisamoscriarumtipodiferentedeprojetonoVisualStudio,oConsoleApplication.

Para criarmos a aplicação que usa o terminal, devemos seguir os mesmos passos da criação doWindows Form Application , porém escolheremos o Console Application na janela doassistente.

Quandocriamosumaaplicaçãonoconsole,oVisualStudiocriaumnovoprojetocomumaclassequecontémummétodochamadoMain.ÉessemétodoqueseráexecutadoquandoapertarmosF5pararodaroprograma.

Dentro do Main , podemos imprimir uma mensagem no terminal utilizando oConsole.WriteLinepassandoamensagem:

Console.WriteLine("Mensagemquevaiparaoterminal");

Quandoqueremoslerumalinhaqueousuáriodigitounoterminal,utilizamosumatributodotipoTextReaderdaclasseConsolechamadoIn:

TextReaderleitor=Console.In;

NoTextReader,temosométodoReadLinequeconseguelerumalinhadoterminal.

stringlinha=leitor.ReadLine();

OReadLinedevolveumastringnãonula,enquantoousuáriocontinuarenviandonovaslinhas.

while(linha!=null){//usaotextodalinhaatuallinha=leitor.ReadLine();}

QuandoousuáriomandaacombinaçãoCtrl+zparaaaplicação,oleitordevolvenull.

CrieumprogramaquelêeimprimeaslinhasqueousuáriodigitanoterminalatéquesejaenviadaacombinaçãoCtrl+z.

6. (Opcional)Quandofizemosaleituradeumarquivo,utilizamosocódigo:

.

Page 190: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

using(Streamentrada=File.Open("entrada.txt",FileMode.Open))using(StreamReaderleitor=newStreamReader(entrada)){//usaoleitor}

NoC#,oStreamReaderéumasubclassedaclasseabstrataTextReader,amesmaqueutilizamosparalerdadosdoterminal,logopodemosreescreverocódigodaleituradearquivopara:

using(Streamentrada=File.Open("entrada.txt",FileMode.Open))using(TextReaderleitor=newStreamReader(entrada)){//usaoleitor}

Quais modificações deveríamos fazer nesse código para ler o texto que o usuário digitou noterminal?

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

Precisamos tomar muito cuidado ao escrever programas que guardam informações dentro dearquivos.Comoditoanteriormente,quandoutilizamosoFile.Open,oC#procuraoarquivonapastaemqueaaplicaçãoestásendoexecutada,porémmuitasvezesosprogramasescritossãoinstaladosempastas do sistema operacional, por exemplo C:/Arquivos de Programas, nesse caso o programatentaráescreveras informaçõesdentrodeumpastadosistemaoperacionalepor isso,elesópodeserexecutadoporumadministradordosistema.

Normalmente,quandoescrevemosumaaplicaçãocomalgumerrodeprogramação,issonãoafetaosistemaoperacionalpoisoprogramanãoéexecutadocompermissõesdeadministradore,portanto,nãopode fazermodificações perigosas no sistema. Então, para que a aplicação não precise ser executadocomo administrador, podemos fazer com que ela escreva, por exemplo, na pasta de documentos dousuáriologado.

Agoraéamelhorhoradeaprenderalgonovo

22.5 PARA SABER MAIS — ONDE COLOCAR OS ARQUIVOS DAAPLICAÇÃO

.

Page 191: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Quandoqueremosrecuperarocaminhoparaumapastaespecialdosistemaoperacional,podemosutilizar uma classe do C# chamada Environment do namespace System. Nessa classe, podemosinvocarométodoGetFolderPath para recuperaro caminhoparaumapastado sistema.OmétodoGetFolderPathrecebecomoargumentoumaconstantequeindicaqualéapastaquequeremos.Pararecuperarmosocaminhoparaapastadedocumentosdousuário logado,podemosutilizaro seguintecódigo:

stringpastaDocumentos=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Os outros valores aceitos pelo método GetFolderPath podem ser encontrados nessa página:http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

Agora se quisermos abrir um arquivo chamado entrada.txt dentro da pasta de documentos,precisamos combinar o caminho da pasta com o nome do arquivo. Para resolver esse problema,utilizamosométodoCombinedaclassePathdonamespaceSystem.IO:

stringpastaDocumentos=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

stringcaminhoArquivo=Path.Combine(pastaDocumentos,"entrada.txt");

.

Page 192: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO23

EmC# textos são representados por objetos do tipostring. Para criar um texto, podemos usar aseguintesintaxe:

stringtitulo="ArquiteturaeDesigndeSoftware";MessageBox.Show(titulo);//imprimeoconteúdo

Podemosaindajuntarduasstrings:

stringtitulo="Arquitetura"+"e"+"DesigndeSoftware";titulo+="!"//concatenaa!nofimdotexto

Usandoaconcatenação,podemosinserirovalordequalquervariávelnomeiodenossotexto:

intidade=42;MessageBox.Show("aidadeatualé"+idade);

Mas ficar concatenando strings nem sempre é fácil, principalmente se temos muitos valores.Podemosusarumaalternativa,fazendoopróprioC# fazeressaconcatenaçãopornós.Paraisso,bastaindicarnastringaposiçãoquequerinseriravariávelusandoasintaxe{posicao},epassarovalorcorrespondenteemordem:

stringnome="Guilherme";intidade=42;Console.WriteLine("Olá{0},asuaidadeé{1}",nome,idade);

Casoprecisemosarmazenarastringjáconcatenadaemumavariávelaoinvésdeaimprimir,bastausarométodoFormat:

stringnome="Guilherme"intidade=42;stringtxt=string.Format("Olá{0},asuaidadeé{1}",nome,idade);MessageBox.Show(txt);

Imagine que temosuma linhade texto que separa os dadosdeumusuário do sistema através devírgulas:

stringtexto="guilhermesilveira,42,sãopaulo,brasil";

Comosepararcadaumadaspartesatravésda,?AclasseStringcontatambémcomummétodoSplit,quedivideaStringemumarraydeStrings,dadodeterminadocaracterecomocritério:

stringtexto="guilhermesilveira,42,sãopaulo,brasil";string[]colunas=texto.Split(',');

MANIPULAÇÃODESTRINGS

.

Page 193: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

SemprequechamamosummétodoemumobjetoString,umnovoobjetoécriadoe retornadopelo método, mas o original nunca é modificado. Strings são imutáveis. Portanto ao tentarmostransformaremletramaiúsculaoresultadopodenãoseroesperado:

stringcurso="fn13";curso.ToUpper();MessageBox.Show(curso);//imprimefn13

Sendoassim,quandoqueremostransformaremmaiúsculodevemosatribuiroresultadodométodo:

stringcurso="fn13";stringmaiusculo=curso.ToUpper();MessageBox.Show(maiusculo);//imprimeFN13

PodemossubstituirpartedoconteúdodeumaString,usandoométodoReplace:

stringcurso="fn13";curso=curso.ToUpper();curso=curso.Replace("1","2");MessageBox.Show(curso)//imprimeFN23;

Podemosconcatenarasinvocaçõesdemétodo,jáqueumastringédevolvidaacadainvocação:

stringcurso="fn13";curso=curso.toUpper().Replace("1","2");MessageBox.Show(curso)//imprimeFN23;

Àsvezesprecisamosquebrarnossostextosempartesmenorescombasenaquantidadedecaracteres,ouainda,encontraraposiçãodeumcaractereespecíficodentrodenossastring:

stringnomeCompleto="guilhermesilveira";stringnome=nomeCompleto.Substring(0,9);MessageBox.Show(nome)//imprimeguilherme;

Eparabuscarocaractereespaçodentrodeumastring:

intposicaoDoEspaco=nomeCompleto.IndexOf("");MessageBox.Show(posicaoDoEspaco);//imprime8

Ouainda,usaressesmétodosemconjunto,paraumexemplomaisavançado,noqualimprimimososegundonome:

stringnomeCompleto="guilhermesilveira";

intinicioDoSegundoNome=nomeCompleto.IndexOf("s");

MessageBox.Show(nomeCompleto.Substring(inicioDoSegundoNome));//imprimesilveira

1. Observeoseguintetrechodecódigo:

stringconteudo="16,23,34,24,15,25,35,35,54,32";

string[]idades=????;

23.1EXERCÍCIOS

.

Page 194: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

foreach(varninidades){MessageBox.Show(n);}

Qualtrechodecódigodevesubstituiras???paraimprimirtodososnúmeros?

csharpconteudo.Split(',');

csharpconteudo.Replace("","\n");

csharpconteudo.Split(,);

csharpconteudo.Split('');

2. Vamosagoramelhoraroeditordetextoquecriamosnocapítuloanteriorutilizandoasoperaçõesemstring!Inicialmente,vamosincluirafuncionalidadedebuscadestringsnaaplicação.

Vamoscriarmaisumcampodetextonoformulárioqueseráutilizadopelousuárioparadigitarotermoqueserábuscadonoeditor.ChameessecampodetextodetextoBusca.Alémdocampodetexto, inclua tambémumbotãoque, quandoclicado,buscaráo textodotextoBusca dentrodoeditor.Chame-odebotaoBusca.Seuformuláriodeveficarparecidocomoquesegue:

Agora que atualizamos o formulário, vamos implementar a funcionalidade de busca.Na ação dobotãodebusca,vamosutilizarométodoIndexOfparaimplementarabusca:

privatevoidbotaoBusca_Click(objectsender,EventArgse){stringbusca=textoBusca.Text;stringtextoDoEditor=textoConteudo.Text;intresultado=textoDoEditor.IndexOf(busca);if(resultado>=0){MessageBox.Show("acheiotexto"+busca);

.

Page 195: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

}else{MessageBox.Show("nãoachei");}}

Testeessanovafuncionalidadedoprograma.

3. Agoravamosimplementarafuncionalidadefind/replacequeémuitocomumnoseditoresdetextoatuais. Para isso, vamos adicionar mais um campo de texto no formulário que será otextoReplace, além de um novo botão que quando clicado trocará todas as ocorrências detextoBuscaportextoReplacedentrodoeditor.EssebotãoseráobotaoReplace.

4. Vamosagoraadicionarumnovobotãonoformulárioquequandoclicadofarácomqueotextodoeditorfiquecomletrasmaiúsculas.UtilizeométodoToUpper()daStringparafazeressetrabalho.

5. (Opcional)AdicionetambémumbotãoqueutilizaoToLower()dastring.

6. (Opcional)Agora vamos fazer comque o botãoToUpper altere apenas o pedaço que o usuárioselecionardotextodigitadoaoinvésdetodootexto.Paraisso,utilizaremosduasnovaspropriedadesdoTextBoxquelidamcomseleçãodetexto:SelectionStarteSelectionLength.

ApropriedadeSelectionStart nos diz emqual posição, começando em 0, do texto o usuárioiniciou a seleção.SelectionLength nos devolve quantos caracteres do texto estão selecionadosatualmente.

Porexemplo,notextoabaixo:

CursodeC#daCaelum

SeousuárioselecionarapalavraCurso,SelectionStartdevolverá0eSelectionLength,5.

AgoravamosutilizaressasduasnovaspropriedadesparaimplementaroToUppernaseleção:

privatevoidbotaoToUpper_Click(objectsender,EventArgse){intinicioSelecao=textoConteudo.SelectionStart;inttamanhoSelecao=textoConteudo.SelectionLength;

//agoravamosutilizaroSubstringparapegarotextoselecionadostringtextoSelecionado=textoConteudo.Text.Substring(inicioSelecao,tamanhoSelecao);

//alémdotextoselecionado,precisamosdotextoantesdaseleção:stringantes=textoConteudo.Text.Substring(0,inicioSelecao);

//etambémdotextodepoisstringdepois=textoConteudo.Text.Substring(inicioSelecao+tamanhoSelecao);

//EagorasóprecisamosredefinirocampotextotextoConteudo.Text=antes+textoSelecionado.ToUpper()+depois;}

.

Page 196: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

TentefazeromesmoparaobotãoToLower.

Se você está gostando dessa apostila, certamente vai aproveitar os cursosonlinequelançamosnaplataformaAlura.VocêestudaaqualquermomentocomaqualidadeCaelum.Programação,Mobile,Design, Infra,Front-Ende

Business!Ex-alunodaCaelumtem15%dedesconto,sigaolink!

ConheçaaAluraCursosOnline.

Agoraéamelhorhoradeaprenderalgonovo

.

Page 197: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

CAPÍTULO24

Muitasvezesusamosclassescriadasporoutrosdesenvolvedores,comoporexemplotodasasclassesdo.NETframework.Aclassestringéumbomexemploecheiademétodosúteismasquemdesenhouaclassenãocolocouummétodoparatransformarumapalavraemseuplural,porexemplo.Oquefazersequeremosopluralde"conta"e"banco"geradoautomaticamente?

Umaabordageméacriaçãodeummétodoestáticoquepodeserchamado:

publicstaticclassStringUtil{publicstaticstringPluralize(stringtexto){if(texto.EndsWith("s")){returntexto;}else{returntexto+"s";}}}

Claroqueessemétodoéumaabordagembemsimplesparaumalgoritmoqueécapazderetornarplurais,masjáresolveoproblemanocasogeral.Agorapodemosemtodolugardonossocódigofazer:

stringbancos=StringUtil.Pluralize("banco");stringcontas=StringUtil.Pluralize("conta");

Por mais que a implementação funcione, o código fica muito feio porque toda vez precisamosinvocarométodoestático.Nãoseriapossívelestenderaclassestringparafazeralgocomoocódigoaseguir?

Stringtexto="banco";Stringplural=texto.Pluralize();

OC#permiteacriaçãodemétodosdeextensãoparaclassesquejáexistematravésdousodapalavrausing,mas para isso devemos colocar nossa classe estática dentro de umnamespace e adicionar apalavrathisaoprimeiroparâmetro:

APÊNDICE—ESTENDENDOCOMPORTAMENTOSATRAVÉSDEMÉTODOSEXTRAS

.

Page 198: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

namespaceMinhasExtensoes{publicstaticclassStringExtensions{publicstaticstringPluralize(thisstringtexto){if(texto.EndsWith("s")){returntexto;}else{returntexto+"s";}}}}

Agorapodemos:

usingMinhasExtensoes;

stringtexto="banco";stringplural=texto.Pluralize();

Notecomo,aoimportarasextensões,todososmétodosestáticosdeclassesestáticaspúblicasdentrodo namespace importado estarão disponíveis para serem acessados como se pertencessem a classe,apesardenãopertencerem.

É importante lembrarqueométodosópodeseracessadocasoaindanãoexistaumoutrométodocomomesmonomeetiposdeparâmetrosnaclasse.Istoé,nãoseriapossívelestenderaclassestringcomumnovométodoToString()poiselejáexiste.Sópodemosadicionarnovoscomportamentos.

Exatamenteporissopodeserperigosoadicionarmétodoscomoextensõessemcuidadonenhum:nofuturoalguémpodeadicionaressemétodoàclassequeestendemoseagoranossocódigoquebrapoisnãoémaiscompatível.Somenteestendaoscomportamentosdeumaclassecasosejanecessário.

1. Queremos"adicionar"atodasasnossascontasacapacidadedeumaContasetransformaremXML.ParaissooC#jádispõeumaAPI:

usingSystem.IO;usingSystem.Xml.Serialization;publicstaticclassSerializer{publicstaticstringAsXml(Contaresource){

varstringWriter=newStringWriter();newXmlSerializer(resource.GetType()).Serialize(stringWriter,resource);returnstringWriter.ToString();}}

Paraacessaresseprocessofazemos:

24.1EXERCÍCIOS

.

Page 199: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Contaconta=newConta();System.Console.Write(Serializer.AsXml(conta));

Comodesejamos usar o recurso de extensão externa doC# para poder "adicionar" ummétodo atodosascontasdosistema,oquedevemoscolocarnalinhacomentadaparadefinirnossométodo?

usingSystem.IO;usingSystem.Xml.Serialization;

namespaceCaelum{publicstaticclassObjectExtensions{//Definiçãodométodo{varstringWriter=newStringWriter();newXmlSerializer(resource.GetType()).Serialize(stringWriter,resource);returnstringWriter.ToString();}}}

//UsousingSystem;usingCaelum;Contaconta=newConta();Console.Write(conta.AsXml());

publicstaticstringAsXml(thisContaresource)

publicstringAsXml(Contaresource)

publicstringAsXml(thisContaresource)

publicstaticstringAsXml(Contaresource)

publicstaticextensionstringAsXml(Contaresource)

publicstaticstringAsXml(extensionContaresource)

2. Em vez de adicionar o extension method a todas as nossas contas, queremos incluir essecomportamentocomoextensãoatodososobjetosdosistema.Comodefiniressemétodo?

publicstaticclassSerializer{//comodefinirométodo???{

varstringWriter=newStringWriter();newXmlSerializer(resource.GetType()).Serialize(stringWriter,resource);returnstringWriter.ToString();

}}

publicstaticstringAsXml(thisobjectresource)

publicstaticstringAsXml(thisresource)

.

Page 200: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

publicstaticstringAsXml(objectresource)

publicstaticstringAsXml(thisallresource)

3. Definimosumaextensãoaobjectdaseguintemaneira:

namespaceCaelum{publicstaticclassObjectExtensions{publicstaticstringToString(thisobjectresource){varstringWriter=newStringWriter();newXmlSerializer(resource.GetType()).Serialize(stringWriter,resource);returnstringWriter.ToString();}}}

Aodefinirousingadequado,qualoresultadoaochamaroToStringaseguir?

usingCaelum;Contaconta=newConta();MessageBox.Show(conta.ToString());

NãocompilapoisnãopodemossobrescreverométodoToString.

Mostraumaversãoemxmldenossaconta,ouseja,oC#usaoextensionmethod.

ImprimeoresultadotradicionaldométodoToString,ouseja,oC#nãousaoextensionmethod.

4. DadaaclasseContadefinidanoscapítulosanteriores:

publicabstractclassConta{publicdoubleSaldo{get;protectedset;}

//outrosmétodosepropriedadesdaclasseConta}

Eumaclassecomumextensionmethodparaaconta:

publicstaticclassContaExtensions{publicstaticvoidMudaSaldo(thisContaconta,doublenovoSaldo){conta.Saldo=novoSaldo;}}

Escolhaaalternativacomaafirmaçãoverdadeira.

Essecódigonãocompila,poisoExtensionMethodsópodeacessarainterfacepúblicadaConta.

Ocódigofuncionanormalmente,poisocompiladordoC#trataumextensionmethodcomosefosseummétododaContae,portanto,ométodopodeacessarosmétodoseatributosprivateeprotecteddaConta.

.

Page 201: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

Ocódigocompilanormalmente,porémsópodemosusaroMudaSaldodentrodaprópriaclasseConta.

5. Sobreocódigoaseguir:

publicabstractclassConta{publicClienteTitular{get;set;}//outrosmétodoseatributosdaconta}

publicstaticclassContaExtensions{publicstaticvoidMudaTitular(thisContaconta,thisClientetitular){conta.Titular=titular;}}

Oquepodemosafirmar?

Ocódigonãocompila,poisothissópodeficarnoprimeiroargumentodoextensionmethod.

Compila normalmente e podemos usar oMudaTitular como extensionmethod de Conta e deCliente.

Compilanormalmente,porémométodosópodeserusadocomoextensionmethoddeConta.

6. Dadasasclasses:

publicabstractclassConta{publicClienteTitular{get;set;}//outrosmétodoseatributosdaConta}publicstaticclassContaExtensions{publicstaticvoidMudaTitular(thisContac,Clientetitular){c.Titular=titular;}}

Oquepodemosafirmarsobreocódigoaseguir?

Contac=newContaCorrente();Clientetitular=newCliente("victor");ContaExtensions.MudaTitular(c,titular);

ExtensionMethodéummétodoestáticocomume,portanto,ocódigodoexercíciofunciona.

Ocódigodoexercícionãocompila.SópodemosusaroMudaTitularcomoextensionmethodenãocomométodoestático.

Ocódigonãocompila,poistemosumthisnoprimeiroargumentodoMudaTitular.

.

Page 202: uso comercial deste material, por favor, consulte a Caelum … · 2019-02-14 · 30 48 58 63 81 5.4 Exercícios 28 6 Classes e objetos 6.1 Organizando o código com Objetos 30 6.2

AAlura oferece centenasdecursosonline em suaplataforma exclusivadeensinoquefavoreceoaprendizadocomaqualidadereconhecidadaCaelum.VocêpodeescolherumcursonasáreasdeProgramação,Front-end,Mobile,

Design & UX, Infra e Business, com um plano que dá acesso a todos os cursos. Ex-aluno daCaelumtem15%dedescontonestelink!

ConheçaoscursosonlineAlura.

JáconheceoscursosonlineAlura?

.