18
1 CAPÍTULO 6 Classes e objetos Neste momento, queremos representar diversas contas em nosso banco. Um composta por um n"mero, nome do titu!ar e sa!do. Podemos uardar essas i int numero'aConta( ) (* string titu!ar'aConta( ) + oaquim osé+ * double sa!do'aConta( ) (- . * Para representar outros correntistas, precisamos de novas variáveis& int numero'aConta/ ) /* string titu!ar'aConta/ ) +0i!va 1avier+* double sa!do'aConta/ ) /- . * 2e3a que, como as in#orma$%es das contas est4o espa!5adas em diversas misturarmos essas in#orma$%es dentro do c dio. A!ém disso, imaine que ap!ica$4o precisamos #a7er uma va!ida$4o do CP8 do titu!ar. Nesse caso p que e:ecuta essa va!ida$4o, mas como podemos arantir que essa va!ida$4o <sses pontos !istados s4o a!uns dosprob!emas do esti!o de prorama$4o procedura!. =uando traba!5amos com prorama$4o procedura!, os dados da ap!ica$4o #icam sepa ! icas de ne cio e, a!ém disso, é muito di#9ci! arantir as va!ida$%e 6.1 - O RGANIZANDO O CÓDIGO COM O B!"O# Para come$armos com a orienta$4o a ob3etos, vamos inicia!mente pensar descrevem uma determinada Conta. Toda conta bancária possui um n"mero, titu!ar e sa!do. Para representarmos a conta com essas in#orma$%es dentro do pro3eto, no C>, p $lasse . 'entro do C> a dec!ara$4o da c!asse é #eita uti!i7ando?se a pa!avra $lass seuida do nome da c!asse queremos imp!ementar& $lass Conta @ O c dio da c!asse Conta, por conven$4o, deve #icar dentro de um arqu ent4o a c!asse Conta será co!ocado em arquivo c5amadoConta.cs. 'entro dessa c!asse queremos arma7enar as in#orma$%es que desc dec!arando variáveis dentro da c!asse, essas variáveis s4o os atributos & $lass Conta @ int numero* string titu!ar* double sa!do* Porém, para que o c dio da ap!ica$4o possa !er e escrever nesses atr uti!i7ando a pa!avra pub!ic& $lass Conta

C# Classes e Objetos

Embed Size (px)

DESCRIPTION

C# Classes e Objetos

Citation preview

1

Captulo6Classes e objetosNeste momento, queremos representar diversas contas em nosso banco. Uma conta bancria geralmente composta por um nmero, nome do titular e saldo. Podemos guardar essas informaes em variveis:int numeroDaConta1 = 1;string titularDaConta1 = "Joaquim Jos";double saldoDaConta1 = 1500.0;Para representar outros correntistas, precisamos de novas variveis:int numeroDaConta2 = 2;string titularDaConta2 = "Silva Xavier";double saldoDaConta2 = 2500.0;Veja que, como as informaes das contas esto espalhadas em diversas variveis diferentes, muito fcil misturarmos essas informaes dentro do cdigo. Alm disso, imagine que antes de adicionarmos a conta na aplicao precisamos fazer uma validao do CPF do titular. Nesse caso precisaramos chamar uma funo que executa essa validao, mas como podemos garantir que essa validao sempre executada?Esses pontos listados so alguns dos problemas do estilo de programao procedural. Quando trabalhamos com programao procedural, os dados da aplicao ficam separados da implementao das lgicas de negcio e, alm disso, muito difcil garantir as validaes dos dados da aplicao.6.1 - Organizando o cdigo com ObjetosPara comearmos com a orientao a objetos, vamos inicialmente pensar quais so as informaes que descrevem uma determinada Conta. Toda conta bancria possui um nmero, titular e saldo. Para representarmos a conta com essas informaes dentro do projeto, no C#, precisamos criar umaclasse. Dentro do C# a declarao da classe feita utilizando-se a palavraclassseguida do nome da classe que queremos implementar:class Conta{

}O cdigo da classeConta, por conveno, deve ficar dentro de um arquivo com o mesmo nome da classe, ento a classeContaser colocado em arquivo chamadoConta.cs.Dentro dessa classe queremos armazenar as informaes que descrevem as contas, fazemos isso declarando variveis dentro da classe, essas variveis so os atributos:class Conta{ int numero; string titular; double saldo;}Porm, para que o cdigo da aplicao possa ler e escrever nesses atributos, precisamos declar-los utilizando a palavrapublic:class Conta{ // numero, titular e saldo so atributos do objeto public int numero; public string titular; public double saldo;}Para utilizarmos a classe que criamos dentro de uma aplicao windows form, precisamos criar uma nova conta no cdigo do formulrio, fazemos isso utilizando a instruonewdo C#:// cdigo do formulrioprivate void button1_Click(object sender, EventArgs e){ new Conta();}Quando utilizamos onewdentro do cdigo de uma classe estamos pedindo para o C# criar uma nova instncia deContana memria, ou seja, o C# alocar memria suficiente para guardar todas as informaes daContadentro da memria da aplicao.Alm disso, o new possui mais uma funo, devolver areferncia, uma seta que aponta para o objeto em memria, que ser utilizada para manipularmos aContacriada. Podemos guardar essa referncia dentro de uma varivel do tipoConta:// cdigo do formulrioprivate void button1_Click(object sender, EventArgs e){ Conta c = new Conta();}Na memria da aplicao teremos uma situao parecida com a ilustrada na imagem a seguir:

Veja que a classe funciona como uma receita que ensina qual o formato de umaContadentro da aplicao. AContaque foi criada na memria pelo operadornew chamada deinstnciaouobjeto.E agora para definirmos os valores dos atributos que sero armazenados naConta, precisamos acessar o objeto que vive na memria. Fazemos isso utilizando o operador.do C#, informando qual o atributo que queremos acessar. Para, por exemplo, guardarmos o valor 1 como nmero da conta que criamos, utilizamos o cdigo a seguir:// cdigo do formulrioprivate void button1_Click(object sender, EventArgs e){ Conta c = new Conta(); c.numero = 1;}Com esse cdigo, estamos navegando na referncia armazenada na varivelc, e acessando o campo nmero do objetoContaque vive na memria. Dentro desse campo colocamos o valor 1. Podemos fazer o mesmo para os outros campos daConta:private void button1_Click(object sender, EventArgs e){ Conta c = new Conta(); c.numero = 1; c.titular = "victor"; c.saldo = 100;}Depois da execuo desse cdigo, teremos a seguinte situao na memria da aplicao:

Veja que, quando utilizamos um objeto para guardar informaes, todos os atributos ficam agrupados dentro de um nico objeto na memria, e no espalhados dentro de diversas variveis diferentes.6.2 - Extraindo comportamentos atravs de mtodosAgora que conseguimos criar a primeira conta da aplicao, vamos tentar fazer algumas operaes. A primeira operao que queremos implementar a operao de tirar dinheiro da conta. Para isso, como vimos no captulo anterior, podemos utilizar o operador-=do C#:Conta c = new Conta();c.numero = 1;c.titular = "victor";c.saldo = 100;// a conta termina com saldo de 50.0c.saldo -= 50.0;Mas o que aconteceria se tentssemos tirar mais100.0dessa conta?c.saldo -= 100.0;Ao executarmos essa segunda operao, a conta terminar com saldo de-50.0, porm nesse sistema as contas no podem ficar com saldo negativo! Portanto, antes de tirarmos dinheiro da conta, precisamos verificar se ela possui saldo suficiente.if(c.saldo >= 100.0){ c.saldo -= 100.0;}Repare que teremos que copiar e colar essa verificao em todos os pontos da aplicao em que desejamos fazer um saque, mas o que aconteceria se fosse necessrio cobrar uma taxa em todos os saques? Teramos que modificar todos os pontos em que o cdigo foi copiado. Seria mais interessante isolar esse cdigo dentro de um comportamento daConta.Alm de atributos, os objetos tambm podem possuirmtodos. Os mtodos so blocos de cdigo que isolam lgicas de negcio do objeto. Ento podemos isolar a lgica do saque dentro de um mtodoSacada classeConta.Para declarar um mtodo chamadoSacana classeConta, utilizamos a seguinte sintaxe:class Conta{ // declarao dos atributos public void Saca() { // Implementao do mtodo }}Dentro desse mtodoSaca, colocaremos o cdigo da lgica de saque.public void Saca(){ if(c.saldo >= 100.0) { c.saldo -= 100.0; }}Porm, nesse cdigo temos dois problemas: no podemos utilizar a varivelc, pois ela foi declarada no formulrio e no dentro do mtodo e o valor do saque est constante.Nesse mtodoSaca, queremos verificar o saldo da conta em que o mtodo foi invocado. Para acessarmos a referncia em que um determinado mtodo foi chamado, utilizamos a palavrathis. Ento para acessarmos o saldo da conta, podemos utilizarthis.saldo:public void Saca() { if(this.saldo >= 100.0) { this.saldo -= 100.0; }}Podemos utilizar oSacadentro do formulrio com o seguinte cdigo:Conta c = new Conta();// inicializa as informaes da contac.saldo = 100.0;

// Agora chama o mtodo Saca que foi definido na classec.Saca();Agora vamos resolver o problema do valor fixo do saque. Quando queremos passar um valor para um mtodo, precisamos passar esse valor dentro dos parnteses da chamada do mtodo:Conta c = new Conta();// inicializa as informaes da contac.saldo = 100.0;

// Agora chama o mtodo Saca que foi definido na classec.Saca(10.0);Para recebermos o valor que foi passado na chamada doSaca, precisamos declarar umargumentono mtodo. O argumento uma varivel declarada dentro dos parnteses do mtodo:public void Saca(double valor){ if(this.saldo >= valor) { this.saldo -= valor; }}Um mtodo pode ter qualquer nmero de argumentos. Precisamos apenas separar a declarao das variveis com uma vrgula.

Voc pode tambm fazer o curso FN-13 dessa apostila na Caelum

Querendo aprender ainda mais sobre C# e boas prticas de orientao a objetos? Esclarecer dvidas dos exerccios? Ouvir explicaes detalhadas com um instrutor?A Caelum oferece ocurso FN-13presencial nas cidades de So Paulo, Rio de Janeiro e Braslia, alm de turmas incompany.Consulte as vantagens do cursoC# e Orientao a Objetos.

6.3 - Devolvendo valores de dentro do mtodoAgora que colocamos o mtodoSacadentro da classeConta, no precisamos replicar o cdigo de validao do saque em todos os pontos do cdigo, podemos simplesmente utilizar o mtodo criado, alm disso, se precisarmos modificar a lgica do saque, podemos simplesmente atualizar o cdigo daquele mtodo, um nico ponto do sistema.Mas da forma que foi implementado, o usurio desse mtodo no sabe se o saque foi ou no bem sucedido. Precisamos fazer com que o mtodo devolva um valor booleano indicando se a operao foi ou no bem sucedida. Devolveremostruecaso a operao seja bem sucedida efalsecaso contrrio. Quando um mtodo devolve um valor, o tipo do valor devolvido deve ficar antes do nome do mtodo em sua declarao. Quando um mtodo no devolve valor algum, utilizamos o tipovoid.// Estamos declarando que o mtodo devolve um valor do tipo boolpublic bool Saca(double valor){ // implementao do mtodo}Dentro da implementao do mtodo, devolvemos um valor utilizamos a palavrareturnseguida do valor que deve ser devolvido. Ento a implementao doSacafica da seguinte forma:public bool Saca(double valor){ if(this.saldo >= valor) { this.saldo -= valor; return true; } else { return false; }}Quando o C# executa umreturn, ele imediatamente devolve o valor e sai do mtodo, ento podemos simplificar a implementao do Saca para:public bool Saca(double valor){ if(this.saldo >= valor) { this.saldo -= valor; return true; } return false;}No formulrio podemos recuperar o valor devolvido por um mtodo.Conta c = new Conta();// inicializa os atributos

// Se a conta tiver saldo suficiente, deuCerto conter o valor true// seno, ela conter falsebool deuCerto = c.Saca(100.0);

if(deuCerto){ MessageBox.Show("Saque realizado com sucesso");}else{ MessageBox.Show("Saldo Insuficiente");}Ou podemos utilizar o retorno do mtodo diretamente dentro doif:Conta c = new Conta();// inicializa os atributos

if(c.Saca(100.0)){ MessageBox.Show("Saque realizado com sucesso");}else{ MessageBox.Show("Saldo Insuficiente");}6.4 - Valor padro dos atributos da classeAgora que terminamos de implementar a lgica de saque da conta, vamos tambm implementar o mtodo de depsito. Esse mtodo no devolver nenhum valor e receber um double como argumento:public void Deposita(double valor){ this.saldo += valor;}No formulrio principal da aplicao, podemos inicializar o saldo inicial com o mtodoDeposita:Conta c = new Conta();c.Deposita(100.0);Nesse cdigo estamos tentando depositar 100 reais em uma conta que acabou de ser criada e o mtodoDepositatenta somar os 100.0 no valor inicial do atributo saldo da conta. Mas qual o valor inicial de um atributo?Quando declaramos uma varivel no C#, ela comea com um valor indefinido, logo no podemos utiliz-la enquanto seu valor no for inicializado, porm a linguagem trata os atributos de uma classe de forma diferenciada. Quando instanciamos uma classe, todos os seus atributos so inicializados para valores padro. Valores numricos so inicializados para zero, obool inicializado para false e atributos que guardam referncias so inicializados para a referncia vazia (valornulldo C#).Ento, no exemplo, quando depositamos 100 reais na conta recm-criada, estamos somando 100 no saldo inicial da conta, que zero, e depois guardando o resultado de volta no saldo da conta.Podemos mudar o valor padro de um determinado atributo colocando um valor inicial em sua declarao. Para inicializarmos a conta com saldo inicial de 100 reais ao invs de zero, podemos utilizar o seguinte cdigo:class Conta{ public double saldo = 100.0; // outros atributos e mtodos da classe}Agora toda conta criada j comear com um saldo inicial de 100.0.6.5 - Mais um exemplo: TransfereAgora vamos tentar implementar a operao de transferncia de dinheiro entre duas contas. Dentro da classeContacriaremos mais um mtodo chamadoTransfere, esse mtodo receber o valor da transferncia e as contas que participaro da operao:public void Transfere(double valor, Conta origem, Conta destino){ // implementao da transferncia}Mas ser que realmente precisamos receber as duas contas como argumento do mtodoTransfere? Vamos ver como esse mtodo ser utilizado dentro do cdigo do formulrio:Conta victor = new Conta();// inicializao da contavictor.saldo = 1000;

Conta guilherme = new Conta();// inicializao da conta

// Agora vamos transferir o dinheiro da conta do victor para a do guilhermevictor.Transfere(10.0, victor, guilherme);Repare que no uso do mtodo estamos repetindo duas vezes a varivelvictor, porm isso no necessrio. Podemos utilizar othispara acessar a conta de origem dentro do mtodo, ento na verdade o mtodoTransfereprecisa receber apenas a conta dedestino:public void Transfere(double valor, Conta destino){ // implementao da transferncia}Antes de tirarmos dinheiro da conta de origem (this), precisamos verificar se ela tem saldo suficiente, somente nesse caso queremos sacar o dinheiro da conta de origem e depositar na conta de destino:public void Transfere(double valor, Conta destino){ if(this.saldo >= valor) { this.saldo -= valor; destino.saldo += valor; }}Mas esse comportamento de verificar se a conta tem saldo suficiente antes de realizar o saque o comportamento do mtodoSacaque foi implementado anteriormente, alm disso, somar um valor no saldo a operaoDepositada conta. Portanto, podemos utilizar os mtodosSacaeDepositaexistentes para implementar oTransfere:public void Transfere(double valor, Conta destino){ if(this.Saca(valor)) { destino.Deposita(valor); }}

Tire suas dvidas no novo GUJ Respostas

O GUJ um dos principais fruns brasileiros de computao e o maior em portugus sobre Java. A nova verso do GUJ baseada em uma ferramenta deperguntas e respostas(QA) e tem uma comunidade muito forte. So mais de 150 mil usurios pra ajudar voc a esclarecer suas dvidas.Faa sua pergunta.

6.6 - Conveno de nomesQuando criamos uma classe, importante lembrarmos que seu cdigo ser lido por outros desenvolvedores da equipe e, por isso, recomendvel seguir padres de nomenclatura.Quando criamos uma classe, a recomendao utilizar oPascal Casingpara nomear a classe: Se o nome da classe composto por uma nica palavra, colocamos a primeira letra dessa palavra em maiscula (conta se tornaConta); Se o nome composto por diversas palavras, juntamos todas as palavras colocando a primeira letra de cada palavra em maiscula (seguro de vida se tornaSeguroDeVida).No caso do nome de mtodos, a conveno tambm utilizar o Pascal Casing (Saca e Deposita, por exemplo).Para argumentos de mtodos, a recomendao utilizar o Pascal Casing porm com a primeira letra em minscula (valorDoSaque, por exemplo), uma conveno chamada Camel Casing.Voc pode encontrar as recomendaes da Microsoft nesse link:http://msdn.microsoft.com/en-us/library/ms229040(v=vs.110).aspx6.7 - Exerccios1. O que uma classe tem? S os atributos de uma entidade do sistema; S atributos ou s mtodos de uma entidade do sistema; S os mtodos de uma entidade do sistema; Atributos e mtodos de uma entidade do sistema.2. Vamos criar a classeContadentro do projeto inicial utilizando o Visual Studio.No Visual Studio clique com o boto direito no nome do projeto e selecione a opoAdd > Class...

Dentro da janela aberta pelo Visual Studio, precisamos definir qual o nome da classe que queremos criar. Escolha o nomeConta:

Depois de colocar o nome da classe, clique no botoAdd. Com isso, o Visual Studio criar um novo arquivo dentro do Projeto, oConta.cs. Todo o cdigo da classeContaficar dentro desse arquivo:class Conta{ // O cdigo da classe fica aqui dentro!}Agora declare os seguintes atributos dentro daConta:saldo(double),titular(string) enumero(int).3. Qual dos comandos a seguir instancia uma nova Conta? Conta conta = Conta(); Conta conta = new Conta(); Conta conta = Conta.new();4. Levando em considerao o cdigo:5. Conta c = new Conta();6. c.saldo = 1000.0;Qual das linhas a seguir adiciona 200 reais nesse saldo? saldo += 200; c.saldo += 200; Conta c.saldo += 200; Conta.saldo += 200;7. Agora vamos testar a classeContaque acabamos de criar. Coloque um novo boto no formulrio da aplicao. D um duplo clique nesse boto para definirmos qual ser o cdigo executado no clique do boto.8. private void button1_Click(object sender, EventArgs e)9. {10. // ao do boto aqui.11. }Dentro do cdigo desse boto, instancie uma novaContae tente fazer alguns testes preenchendo e mostrando seus atributos atravs doMessageBox.Show. Por exemplo:private void button1_Click(object sender, EventArgs e){ Conta contaVictor = new Conta(); contaVictor.titular = "victor"; contaVictor.numero = 1; contaVictor.saldo = 100.0; MessageBox.Show(contaVictor.titular);}Tente fazer testes com diversas contas e veja que cada instncia de conta possui seus prprios atributos.12. Agora vamos implementar mtodos na classeConta. Comearemos pelo mtodoDeposita, esse mtodo no devolve nada e deve receber um argumento do tipodoubleque o valor que ser depositado naConta. A sua classe deve ficar parecida com a que segue:13. // dentro do arquivo Conta.cs14. 15. class Conta16. {17. // declarao dos atributos18. 19. public void Deposita(double valor)20. {21. // o que colocar aqui na implementao?22. }23. }Depois de implementar o mtodoDeposita, implemente tambm o mtodoSaca. Ele tambm no devolve valor algum e recebe umdoubleque o valor que ser sacado da conta.24. Agora vamos testar os mtodos que acabamos de criar. Na ao do boto que utilizamos para testar a conta, vamos manipular o saldo utilizando os mtodosDepositaeSaca:25. private void button1_Click(object sender, EventArgs e)26. {27. Conta contaVictor = new Conta();28. contaVictor.titular = "victor";29. contaVictor.numero = 1;30. contaVictor.Deposita(100);31. MessageBox.Show("Saldo: " + contaVictor.saldo);32. contaVictor.Saca(50.0);33. MessageBox.Show("Saldo: " + contaVictor.saldo);34. }Tente fazer depsitos e saques em vrias instncias diferentes deConta, repare que dentro dos mtodos a varivelthispossui o valor da referncia em que o mtodo foi invocado.35. Qual a sada do cdigo a seguir:36. Conta mauricio = new Conta();37. mauricio.saldo = 2000.0;38. 39. Conta guilherme = new Conta();40. guilherme.saldo = 5000.0;41. 42. mauricio.saldo -= 200.0;43. guilherme.saldo += 200.0;44. 45. MessageBox.Show("mauricio = " + mauricio.saldo);46. MessageBox.Show("guilherme = " + guilherme.saldo); mauricio = 2200.0 e guilherme = 4800.0 mauricio = 2200.0 e guilherme = 5200.0 mauricio = 1800.0 e guilherme = 5000.0 mauricio = 1800.0 e guilherme = 5200.047. Qual a sada do cdigo a seguir?48. Conta mauricio = new Conta();49. mauricio.numero = 1;50. mauricio.titular = "Mauricio";51. mauricio.saldo = 100.0;52. 53. Conta mauricio2 = new Conta();54. mauricio2.numero = 1;55. mauricio2.titular = "Mauricio";56. mauricio2.saldo = 100.0;57. 58. if (mauricio == mauricio2)59. {60. MessageBox.Show("As contas so iguais");61. }62. else63. {64. MessageBox.Show("As contas so diferentes");65. } As contas so iguais As contas so diferentes No mostrado nenhuma mensagem66. Qual a sada do cdigo a seguir:67. Conta mauricio = new Conta();68. mauricio.saldo = 2000.0;69. 70. Conta copia = mauricio;71. copia.saldo = 3000.0;72. 73. MessageBox.show("mauricio = " + mauricio.saldo);74. MessageBox.show("copia = " + copia.saldo); mauricio = 2000.0 e copia = 3000.0 mauricio = 3000.0 e copia = 2000.0 mauricio = 2000.0 e copia = 2000.0 mauricio = 3000.0 e copia = 3000.075. (Opcional) Implemente o mtodoTransfereque recebe o valor da transferncia e a conta de destino. Faa com que ele reutilize as implementaes dos mtodosSacaeDeposita.76. (Opcional) Vamos adicionar uma validao no mtodoSacadaConta. Modifique o mtodoSacapara que ele no realize o saque caso o saldo atual da conta seja menor do que o valor recebido como argumento.77. (Opcional) Modifique o mtodoSacacom validao para que ele devolva o valortruecaso o saque tenha sido realizado com sucesso efalsecaso contrrio. Depois modifique o cdigo do boto de teste da conta para que ele utilize o valor devolvido pelo mtodoSacapara mostrar uma mensagem para o usurio. Caso o saque seja bem sucedido, queremos mostrar a mensagem "Saque realizado com sucesso", se no, mostraremos "Saldo insuficiente"78. (Opcional) Agora altere o mtodoSacada classe Conta. Limite o valor do saque para R$ 200,00 caso o cliente seja menor de idade.Lembre-se que ainda necessrio validar se o valor a ser sacado menor ou igual ao saldo atual do cliente e maior do que R$ 0,00.6.8 - Composio de classesQuando abrimos uma conta no banco, temos que fornecer uma srie de informaes: nome, CPF, RG e endereo.Vimos que quando queremos armazenar informaes em uma classe, devemos criar atributos. Mas em qual classe colocar esses novos atributos? Claramente essas informaes no pertencem a umaConta. Esses dados pertencem ao titular da conta, ou seja, essas informaes pertencem ao cliente do banco.Ento devemos armazen-las em uma classeCliente.class Cliente { public string nome; public string cpf; public string rg; public string endereco;}Sabemos tambm que toda conta est associada a um cliente, ou seja, a conta guarda uma referncia ao cliente associado.class Conta { // outros atributos da Conta public Cliente titular; // comportamentos da conta}Agora, quando vamos criar uma conta, podemos tambm colocar seu titular.Cliente victor = new Cliente();victor.nome = "victor";

Conta umaConta = new Conta();umaConta.titular = victor;Vimos tambm que o atributotitularguarda uma referncia(seta) para uma instncia deCliente(objeto na memria). Logo, a atribuioumaConta.titular = victorest copiando a referncia da varivelvictorpara o atributotitular.Podemos modificar os atributos doClienteatravs da referncia guardada no atributotitulardaConta.Cliente victor = new Cliente();victor.nome = "victor";

Conta umaConta = new Conta();umaConta.titular = victor;

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

// Mostra o nome victorMessageBox.Show(umaConta.titular.nome);

// Mostra o texto 12345678-9MessageBox.Show(victor.rg);

Nova editora Casa do Cdigo com livros de uma forma diferente

Editoras tradicionais pouco ligam para ebooks e novas tecnologias. No conhecem programao para revisar os livros tecnicamente a fundo. No tm anos de experincia em didticas com cursos.Conhea aCasa do Cdigo, uma editora diferente, com curadoria daCaelume obsesso por livros de qualidade a preos justos.Casa do Cdigo, ebook com preo de ebook.

6.9 - Exerccios1. Crie a classeClientecontendo os atributosnome(string),rg(string),cpf(string) eendereco(string). Modifique a classeContae faa com que seu atributotitularseja do tipoClienteao invs destring.Tome cuidado. Aps essa modificao no poderemos atribuir o nome do cliente diretamente ao atributotitulardaConta. Para definir o nome do titular, precisaremos de um cdigo parecido com o que segue:Conta conta = new Conta();Cliente cliente = new Cliente();conta.titular = cliente;conta.titular.nome = "Victor";2. Qual a sada que ser impressa ao executar o seguinte trecho de cdigo?3. Conta umaConta = new Conta();4. Cliente guilherme = new Cliente();5. guilherme.nome = "Guilherme Silveira";6. umaConta.titular = guilherme;7. 8. MessageBox.Show(umaConta.titular.nome); Guilherme Silveira Ser mostrado uma caixa de mensagem sem nenhuma mensagem O cdigo no compila9. Qual a sada que ser impressa ao executar o seguinte trecho de cdigo?10. Conta umaConta = new Conta();11. Cliente guilherme = new Cliente();12. guilherme.rg = "12345678-9";13. 14. umaConta.titular = guilherme;15. umaConta.titular.rg = "98765432-1";16. 17. MessageBox.Show(guilherme.rg); 98765432-1 12345678-9 rg No ser impresso nada18. (Opcional) Crie mais um atributo na classeClienteque guarda a idade da pessoa. No nosso caso, a idade um nmero inteiro.Tambm crie um comportamento (mtodo) com o nomeEhMaiorDeIdadena classeClienteque no recebe nenhum argumento e retorna um booleano indicando se o cliente maior de idade ou no. Quando uma pessoa maior de idade no Brasil?

https://www.caelum.com.br/apostila-csharp-orientacao-objetos/