Professional Documents
Culture Documents
CAPTULO 6
Classes e objetos
Neste 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 OBJETOS
Para 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 uma classe.
Dentro do C# a declarao da classe feita utilizando-se a palavra class seguida do nome da classe que
queremos implementar:
class Conta
{
}
O cdigo da classe Conta, por conveno, deve ficar dentro de um arquivo com o mesmo nome da classe,
ento a classe Conta ser 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 palavra public:
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 instruo new do C#:
// cdigo do formulrio
private void button1_Click(object sender, EventArgs e)
{
new Conta();
}
Quando utilizamos o new dentro do cdigo de uma classe estamos pedindo para o C# criar uma nova
instncia de Conta na memria, ou seja, o C# alocar memria suficiente para guardar todas as informaes
da Conta dentro da memria da aplicao.
Alm disso, o new possui mais uma funo, devolver a referncia, uma seta que aponta para o objeto em
memria, que ser utilizada para manipularmos a Contacriada. Podemos guardar essa referncia dentro de
uma varivel do tipo Conta:
// cdigo do formulrio
private 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 uma Conta dentro da
aplicao. A Conta que foi criada na memria pelo operadornew chamada de instncia ou objeto.
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 formulrio
private void button1_Click(object sender, EventArgs e)
{
Conta c = new Conta();
c.numero = 1;
}
Com esse cdigo, estamos navegando na referncia armazenada na varivel c, e acessando o campo
nmero do objeto Conta que 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 MTODOS
Agora 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#:
Porm, nesse cdigo temos dois problemas: no podemos utilizar a varivel c, pois ela foi declarada no
formulrio e no dentro do mtodo e o valor do saque est constante.
Nesse mtodo Saca, 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 palavra this. Ento para acessarmos
o saldo da conta, podemos utilizar this.saldo:
public void Saca()
{
if(this.saldo >= 100.0)
{
this.saldo -= 100.0;
}
}
Podemos utilizar o Saca dentro do formulrio com o seguinte cdigo:
Conta c = new Conta();
// inicializa as informaes da conta
c.saldo = 100.0;
// Agora chama o mtodo Saca que foi definido na classe
c.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 conta
c.saldo = 100.0;
// Agora chama o mtodo Saca que foi definido na classe
c.Saca(10.0);
Para recebermos o valor que foi passado na chamada do Saca, precisamos declarar um argumento no
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.
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 o curso FN-13 presencial nas cidades de So Paulo, Rio de Janeiro e Braslia,
{
if(this.saldo >= valor)
{
this.saldo -= valor;
return true;
}
else
{
return false;
}
}
Quando o C# executa um return, 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 false
bool deuCerto = c.Saca(100.0);
if(deuCerto)
{
MessageBox.Show("Saque realizado com sucesso");
}
else
{
MessageBox.Show("Saldo Insuficiente");
}
10
a operao Deposita da conta. Portanto, podemos utilizar os mtodos Saca e Deposita existentes para
implementar o Transfere:
public void Transfere(double valor, Conta destino)
{
if(this.Saca(valor))
{
destino.Deposita(valor);
}
}
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 de perguntas e respostas (QA) e tem uma
comunidade muito forte. So mais de 150 mil usurios pra ajudar voc a esclarecer suas dvidas.
Se o nome da classe composto por uma nica palavra, colocamos a primeira letra dessa palavra em
maiscula (conta se torna Conta);
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).
11
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).aspx
6.7 - EXERCCIOS
1.
2.
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 nome Conta:
12
Depois de colocar o nome da classe, clique no boto Add. Com isso, o Visual Studio criar um novo arquivo
dentro do Projeto, o Conta.cs. Todo o cdigo da classeConta ficar dentro desse arquivo:
class Conta
{
// O cdigo da classe fica aqui dentro!
}
Agora declare os seguintes atributos dentro da Conta: saldo (double), titular(string) e numero (int).
3.
4.
5.
6.
c.saldo = 1000.0;
Qual das linhas a seguir adiciona 200 reais nesse saldo?
7.
saldo += 200;
c.saldo += 200;
Conta.saldo += 200;
Agora vamos testar a classe Conta que 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.
9.
13
10.
11.
// ao do boto aqui.
}
Dentro do cdigo desse boto, instancie uma nova Conta e tente fazer alguns testes preenchendo e
mostrando seus atributos atravs do MessageBox.Show. Por exemplo:
13.
Agora vamos implementar mtodos na classe Conta. Comearemos pelo mtodoDeposita, esse
mtodo no devolve nada e deve receber um argumento do tipodouble que o valor que ser depositado
na Conta. A sua classe deve ficar parecida com a que segue:
// dentro do arquivo Conta.cs
14.
15.
class Conta
16.
17.
18.
19.
20.
21.
22.
23.
}
}
Depois de implementar o mtodo Deposita, implemente tambm o mtodo Saca. Ele tambm no devolve
valor algum e recebe um double que 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 mtodosDeposita e Saca:
25.
26.
27.
28.
contaVictor.titular = "victor";
29.
contaVictor.numero = 1;
30.
contaVictor.Deposita(100);
31.
14
32.
contaVictor.Saca(50.0);
33.
34.
}
Tente fazer depsitos e saques em vrias instncias diferentes de Conta, repare que dentro dos mtodos a
varivel this possui o valor da referncia em que o mtodo foi invocado.
35.
36.
37.
mauricio.saldo = 2000.0;
38.
39.
40.
guilherme.saldo = 5000.0;
41.
42.
mauricio.saldo -= 200.0;
43.
guilherme.saldo += 200.0;
44.
45.
46.
47.
48.
49.
mauricio.numero = 1;
50.
mauricio.titular = "Mauricio";
51.
mauricio.saldo = 100.0;
52.
53.
54.
mauricio2.numero = 1;
55.
mauricio2.titular = "Mauricio";
56.
mauricio2.saldo = 100.0;
57.
58.
if (mauricio == mauricio2)
59.
60.
61.
62.
else
63.
15
64.
65.
As contas so iguais
As contas so diferentes
66.
67.
68.
mauricio.saldo = 2000.0;
69.
70.
71.
copia.saldo = 3000.0;
72.
73.
74.
75.
(Opcional) Implemente o mtodo Transfere que recebe o valor da transferncia e a conta de destino.
Faa com que ele reutilize as implementaes dos mtodosSaca e Deposita.
76.
(Opcional) Vamos adicionar uma validao no mtodo Saca da Conta. Modifique o mtodo Saca para
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 mtodo Saca com validao para que ele devolva o valortrue caso o saque
tenha sido realizado com sucesso e false caso contrrio. Depois modifique o cdigo do boto de teste da
conta para que ele utilize o valor devolvido pelo mtodo Saca para 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 mtodo Saca da 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 CLASSES
Quando 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 uma Conta. Esses
dados pertencem ao titular da conta, ou seja, essas informaes pertencem ao cliente do banco.
Ento devemos armazen-las em uma classe Cliente.
class Cliente
{
16
17
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 a Casa do Cdigo, uma editora diferente, com curadoria da Caelume obsesso por
6.9 - EXERCCIOS
1.
Crie a classe Cliente contendo os atributos nome (string), rg (string), cpf (string) e endereco (string).
Modifique a classe Conta e faa com que seu atributo titularseja do tipo Cliente ao invs de string.
Tome cuidado. Aps essa modificao no poderemos atribuir o nome do cliente diretamente ao
atributo titular da Conta. Para definir o nome do titular, precisaremos de um cdigo parecido com o que
segue:
3.
4.
5.
6.
umaConta.titular = guilherme;
18
7.
8.
MessageBox.Show(umaConta.titular.nome);
o
Guilherme Silveira
O cdigo no compila
9.
10.
11.
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
18.
(Opcional) Crie mais um atributo na classe Cliente que guarda a idade da pessoa. No nosso caso, a
idade um nmero inteiro.
Tambm crie um comportamento (mtodo) com o nome EhMaiorDeIdade na classeCliente que 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/