Skip to content

#10 Curso C# – Classes

Boa noite galera! Tudo bom com vocês? Faz tempo que eu não publico nada aqui e por isso peço minhas sinceras desculpas. Nesse tempo muita coisa aconteceu e acabei ficando sem tempo. Mas como promessa de ano novo prometi atualizar mais vezes o meu blog e enfim acabar o curso de C# que tanto prometi :). Há e mais uma coisa, vou ser pai novamente :).

Bom chega de conversa. Vamos ao curso! Hoje vou explicar sobre classes e sua utilidade no desenvolvimento C#. Já adianto que sem ela nada faria sentido e no final explico o por que.

O que é?

Classes é algo que podemos classificar como o objeto fundamental da POO (Programação Orientada Objetos), uma vez que é impossível obtermos um programa em C# (ou em qualquer outra linguagem OO) sem que tenhamos pelo menos uma classe. As classes vieram para melhorar muito a programação devido à reutilização de código, não perdendo assim tanto tempo como na programação em tempos anteriores, em que a programação era funcional ou estruturada.

Como tantos outros conceitos na informática, as classes foram inspiradas no “mundo real” e podemos associá-las ao ato de denominar uma entidade que compartilha alguns comportamentos e que possuem um conjunto de propriedades comuns. Fazendo um paralelo com nossa gramática, seria como os substantivos em seu conceito mais primitivo [a palavra que designa seres em geral], onde, por exemplo, usamos o substantivo COMPUTADOR, quando queremos referenciar um objeto formado por monitor, teclado, processador [propriedades], capaz de ligar, desligar, instalar softwares, compilar programas, acessar a internet, manipular documentos [comportamento].

“O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que incorporam estrutura de dados e um conjunto de operações que manipulam estes dados.” Agora vamos olhar a sua estante, o seu guarda-roupa, o seu armário, a sua cozinha. Em todos estes lugares você classificou coisas no seu domínio e, somente de olhar para eles você já sabe relacionar a classificação que utilizou em cada um deles e como classificou as coisas que estão nestes lugares. Na estante você agrupou e organizou os livros, no guarda roupa suas camisas, calças, meias, ternos, etc. Todos os objetos que você classificou nestes lugares foram organizados baseados em alguma concepção que você possuía sobre eles. No contexto orientado a objeto a estante, o armário, a cozinha é chamada de classes.

A estrutura de uma Classe

Pois bem, e como codificar essa maravilha do mundo da POO? A figura abaixo apresenta a estrutura de uma classe com os elementos possíveis que a mesma suporta, que quando bem utilizados, tornam suas aplicações seguras, performáticas, estáveis e legíveis, enfim, os adjetivos essenciais para uma solução de boa qualidade, capaz de tornar seu time de desenvolvimento competente.

[sourcecode language=”csharp”]
using System;
namespace EstudoCSharp
{
class Pessoa
{
string nome;
string cpf;
string rg;
DateTime dataNascimento;
public Pessoa(string nome, string cpf)
{
this.nome = nome;
this.cpf = cpf;
}
public int GetIdade()
{
return DateTime.Now.Year – dataNascimento.Year;
}
}
}
[/sourcecode]

A primeira linha informa o pacote (biblioteca) do framework utilizado para a construção do sistema. O pacote utilizado é o System que é o mínimo que devemos ter para criar uma aplicação em NET por mais básica que esta seja. Para utilizar um pacote em nossa aplicação devemos utilizar a instrução reservada using. Nesta seção podemos utilizar vários pacotes como, por exemplo, o pacote System.Data utilizado para conectar e manipular banco de dados. O pacote tem a função de importar as classes prontas para nossos sistemas para que possamos utilizar e com isso não precisaremos refazê-las novamente. Lembre, este é o beneficio da programação orientada a objetos.

A próxima linha informa em que espaço de classe (namespace) nossa classe será criada. A namespace não é obrigatória, mas tem a função de organizar as classes. Por exemplo. Ao construir todo o sistema da empresa, teremos que criar classes que são de determinados setores e ao criar podemos organizar as classes por setores (namespace financeiro, namespace contas, namespace ti). Assim ao criar um programa que utilize as classes do financeiro iremos declarar no using apenas o financeiro, pois os restos das classes de outros setores não são importantes. Segue abaixo um exemplo:

[sourcecode language=”csharp”]
using System;
using Financeiro;
namespace Contas
{
public class Pagamento
{
}
}
[/sourcecode]

Note que o corpo do exemplo da primeira classe está entre chaves “{ }”. Dentro do corpo da classe temos variáveis declaradas (nome, cpf, rg e dataNascimento). Estas variáveis quando declaradas no corpo de uma classe são chamadas de atributos. Entendemos por atributos [Campo], qualquer variável associada à classe cuja função é armazenar valores utilizados em suas funcionalidades. Nada impede que outros tipos de variáveis possam ser criados como, por exemplo, variáveis locais. Dentro do corpo da classe de exemplo temos dois métodos. Se notarem a diferença estrutural destes métodos tem uma que não retorna nenhum valor e também não é do tipo void. Isso acontece por que este método é um construtor e este nunca retorna nenhum valor.

Os métodos construtores são executados quando a classe é instanciada e jamais são acessados diretamente pelo cliente que possui o objeto da classe. Não se preocupe com a palavra reservada public escrita em cada método. Logo aprenderemos sobre eles. Apenas escreva em todos os seus métodos.

Modificadores de acesso

Quando desenvolvemos classes temos atributos, métodos e construtores. Em algumas classes podemos ter 20, 30 ou mais atributos. Quem utilizar essa classe não precisa saber da existência de atributos que não são necessários saber, precisa saber apenas o que é necessário para manipular o objeto.

Um exemplo disso é um carro. Quem utiliza apenas precisa saber das funcionalidades necessárias para se locomover. Por exemplo: acelerar, frear, trocar macha e etc. A pessoa que dirige o carro não precisa saber como a gasolina vai para o motor e nem tão pouco o tamanho da corrente utilizada pela bateria para dar a partida.

Para esses exemplos em classes temos algo que cuida da visibilidade de atributos e métodos, ou seja, o que deve ou não ser mostrado para o cliente. Os modificadores permitem então que o desenvolvedor possa controlar o nível de acesso de cada membro, permitindo que as características de cada objeto sejam modificadas de uma forma segura e vistas de uma forma necessária ao sistema.

[sourcecode language=”csharp”]
using System;
namespace Contas
{
public class Pagamento
{
public DateTime dataVencimentoPagamento;
public decimal valorPagamento;
public string codigoBarras;
private DateTime dataHoje;
private bool atrasado;
public Pagamento()
{
dataHoje = DateTime.Now;
}
public void Pagar(DateTime dataVencimentoPagamento,
decimal valorPagamento,
string codigoBarras)
{
this.dataVencimentoPagamento = dataVencimentoPagamento;
this.valorPagamento = valorPagamento;
this.codigoBarras = codigoBarras;
VerificaSePagamentoEstaEmAtraso();
}
private void VerificaSePagamentoEstaEmAtraso()
{
if (dataHoje > dataVencimentoPagamento)
atrasado = true;
else
atrasado = false;
}
}
}
[/sourcecode]

Modificadores  Descrição
Public Public Membro é acessado de qualquer lugar
Private Private Membro pode ser acessado somente dentro da classe que o define
Protected Protected Pode ser acessado dentro da classe que o define e pelas classes que a herdam

Escopo de variáveis

Presta atenção na classe Contas

[sourcecode language=”csharp”]
using System;
namespace Contas
{
public class Pagamento
{
private int valorPagamento = 0;
public int GetValorPagamento()
{
return valorPagamento;
}
public void AlterarValorPagamento(int valorPagamento)
{
valorPagamento = 3;
}
}
}
[/sourcecode]

Abaixo temos a classe que chama a classe Contas

[sourcecode language=”csharp”]
using System;
using Contas;
namespace Variaveis
{
class Program
{
static void Main(string[] args)
{
Pagamento p = new Pagamento();
p.AlterarValorPagamento(3);
int valor = p.GetValorPagamento();
}
}
}
[/sourcecode]

Qual é o valor no fim da execução do atributo da classe conta “valorPagamento”? Ela foi utilizada no programa? Como podem observar o exemplo engana o programador que deseje entender o código fonte. No método AlterarValorPagamento a variável utilizada não pertence a classe e sim ao método que recebe como parâmetro. Essa variável de parâmetro só tem vida útil durante a execução do método, após isso podemos dizer que ela é destruída da memória. Já o atributo da classe chamado também valorPagamento esse sim tem uma duração de vida mais longa, pois ela existirá enquanto o objeto estiver na memória, pois ela faz parte da classe e não de algum método. Preste muita atenção no momento de desenvolver sistema, verifique a que escopo a variável pertença.

Propriedade

Conforme visto anteriormente, declarar atributos de classe com visibilidade publica não é legal e o maior motivo para isso é que seu código fica menos seguro e muito acoplado, pois outros objetos estão vendo coisas internas de outros objetos. Lembre-se do exemplo do carro, você não precisa saber sobre as parte internas do motor, você apenas necessita saber em como dirigir com segurança. Para deixar nossas classes conforme segue a lei, será necessário proteger os atributos e criar métodos que configuram ou retornem os seus valores. Abaixo segue um exemplo de como programar tal modelo:

[sourcecode language=”csharp”]
using System;
namespace Contas
{
public class Pagamento
{
private int valorPagamento;
private DateTime dataPagamento;
private string nomeResponsavel;
public void SetValorPagamento(int valorPagamento)
{
this.valorPagamento = valorPagamento;
}
public int GetValorPagamento()
{
return valorPagamento;
}
public void SetDataPagamento(DateTime dataPagamento)
{
this.dataPagamento = dataPagamento;
}
public DateTime GetDataPagamento()
{
return dataPagamento;
}
public void SetNomeResponsavel(string nomeResponsavel)
{
this.nomeResponsavel = nomeResponsavel;
}
public string GetNomeResponsavel()
{
return nomeResponsavel;
}
}
}
[/sourcecode]

Em Java este processo também é feito dessa maneira. Com a utilização de propriedades este exemplo fica mais fácil de entender e em menos código.

[sourcecode language=”csharp”]
using System;
namespace Contas
{
public class Pagamento
{
private int valorPagamento;
public int ValorPagamento
{
get { return valorPagamento; }
set { valorPagamento = value; }
}
private DateTime dataPagamento;
public DateTime DataPagamento
{
get { return dataPagamento; }
set { dataPagamento = value; }
}
private string nomeResponsavel;
public string NomeResponsavel
{
get { return nomeResponsavel; }
set { nomeResponsavel = value; }
}
}
}
[/sourcecode]

Herança

Quando estamos utilizando herança na orientação de objetos no mínimo estamos trabalhando com duas classes. Uma classe (especializada) que herda características de outra classe (genérica). Essas características são passadas de pai (genérica) para filho (especializada) sem que haja cópia de código, isso tudo é feito de forma natural. Com isso podemos chegar à conclusão de que herança no mundo da linguagem de programação significa extensibilidade de classes. Mas por que isso? O beneficio da herança é não precisar reinventar a roda e utilizar códigos que já estejam prontos sem a necessidade de copia-los para uma nova classe.

Abaixo será mostrado um exemplo de herança em C#.

[sourcecode language=”csharp”]
class Pessoa
{
public string Nome
{
get;
set;
}
public DateTime DataNascimento
{
get;
set;
}
public int Idade()
{
return DateTime.Now.Year – DataNascimento.Year;
}
}
class Fisica : Pessoa
{
public string CPF
{
get;
set;
}
}
class Empresa : Pessoa
{
public string CNPJ
{
get;
set;
}
public string NomeFantasia
{
get;
set;
}
}
[/sourcecode]

Repare na classe pessoa, ela é o nosso exemplo genérico e isso acontece por que a mesma herda suas características para as classes especializadas física e empresa. No C# para uma classe herdar de outra é utilizado a sintaxe “:” acompanhado do nome da classe que deseja efetuar a herança. Ao instanciar uma das classes (física ou empresa) podemos utilizar os atributos nome e data de nascimento e também o método idade. Neste exemplo básico mostramos o beneficio que ocorreu em não precisar cópia o código para outras classes.

Relacionamento entre classes

Herança é um tipo de relacionamento de classes, porem uma classe poderá ter relacionamento com outra através de atributos. Exemplo:

[sourcecode language=”csharp”]
class Carro
{
public string Nome
{
get;
set;
}
public int QuantidadePortas
{
get;
set;
}
public Motor Motor
{
get;
set;
}
}
class Motor
{
public double Potencia
{
get;
set;
}
public int Cavalo
{
get;
set;
}
public string Modelo
{
get;
set;
}
public int Valvula
{
get;
set;
}
public void Acelerar()
{
}
}
[/sourcecode]

O tipo de dado Motor utilizado na classe Carro é uma classe que foi criada pelo programador. Neste exemplo carro tem relacionamento com motor, ou seja, um objeto carro tem um objeto motor.

Conclusão

Bom, resumindo, CLASSE é algo extremamente importante em um código de sistema, pois como explicado acima a simulação do mundo real em forma de sistema começa por ela.

Senhores, espero que tenham gostado desse artigo e que seja útil para quem está começando.

Fiquem com Deus e que ele abençoe sempre vocês! Abraços 🙂

Published inC#

Be First to Comment

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *