Classes e Objetos em C# .NET
Tags: csharp, dotnet, programming, learning
Published: 2024-05-23 21:20:14

## Resumo
Neste artigo vamos falar sobre o conceito de classes em C# (C-Sharp), abordando os temas, fundamentos, características e aplicações. As classes são elementos fundamentais da orientação a objetos, são elas que fornecem a estrutura básica dos objetos.

Vamos discutir as definições de classes, seus componentes, propriedades, métodos e seus construtores, falaremos também sobre seus conceitos, como herança, polimorfismo e encapsulamento.


## Introdução
A programação orientada a objetos (POO) é um modelo muito utilizado no desenvolvimento de software. C# (C-Sharp) é uma linguagem de programação desenvolvida pela Microsoft, baseado em C e C++, é uma linguagem orientada a objetos e fortemente tipada, onde o framework .NET (dotNET) e parte integrante da linguagem.

Este artigo vamos falar de uma forma mais abrangente sobre classes, abordando conceitos básicos até os mais avançados.

## Classes
As classes são estruturas de dados fundamentais que representam um tipo de objeto, definindo seu comportamento e quais informações ela pode armazenar.
Classes tem atributos, propriedades, construtor e métodos. Nela está definido toda a estrutura básica de como será composta, ou seja, ela tipifica o que será modelado e determina os estados e comportamentos que os objetos podem ter.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q9h5b2ut2fh8ytjv28be.png)

•	Atributos – Variáveis que armazenam dados.

•	Propriedades – Métodos que fornecem uma interface (Getters e Setters) para acessar e modificar um atributo.

•	Construtor – Método especial chamado quando uma nova instancia de classe é criada.

•	Métodos – Funções que definem o comportamento dos objetos.

## Tipos de acesso das classes
Classes podem ter diferentes níveis de acesso como por exemplo o public, um dos mais utilizado. Os níveis de acesso determinam a visibilidade de uma classe no escopo do projeto (Solution), classes publicas podem ser vistas por outras classes e objetos dentro do mesmo projeto (Solution), tornando os atributos e métodos acessíveis em outras classes e objetos.
Os principais níveis de acesso em C# são:

•Público (public): Uma classe pública é acessível de qualquer lugar dentro do projeto e seus atributos e métodos também serão do tipo público. 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8i5a7axo2fed8q0a8mh9.png)

•Privada (private): Uma classe privada só pode ser acessada dentro da mesma classe, ou seja, a classe e seus atributos e métodos só são visíveis dentro da própria classe. Classe do tipo privada não pode ser instanciada ou acessada.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ulx42ycqhhjvwedlw10z.png)

•Protegida (Protected): Uma classe protegida é acessível dentro da mesma, e de suas classes derivadas, permitindo que a classe derivada acesse seus métodos.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ilcc33ufx8zocbhisdp.png)

•Interna (Internal): Uma classe interna só é acessível dentro do mesmo conjunto, não sendo possível acessar seus atributos e métodos em outra parte do projeto.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ffofltnepqwrrhgl4dcv.png)

## Conceitos de classes
Em orientação a objetos temos cinco conceitos fundamentais em que uma classe pode ter, são ele, Heranças, Polimorfismo, Encapsulamento, Abstração e Interfaces.

## Herança
É um mecanismo em que uma Subclasse herda atributos de uma Superclasse, com isso a Subclasse pode reutilizar o código da Superclasse, estendendo seu comportamento. Para herdamos um classe em C# usamos “ : ” (dois pontos) seguido pelo nome da classe. Por exemplo:

A Superclasse Pessoa, tem seus atributos nome e idade e seus métodos, get e set, para cada atributo.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0lg8l35cegt1pn7hspa.png)

A subclasse Motorista herda a superclasse Pessoa. 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vt2uj0su1ezp51czpgtv.png)

> Note que quando instanciamos a classe Motorista, (var motorista = new Motorsita;) podemos acessar os atributos e métodos da classe Pessoa, sem precisarmos fazer a instanciação da superclasse pessoa.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zs46caei39h2oj4pkrkl.png)

Na execução do código podemos ver o retorno dos atributos Nome, Idade e Carro.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8tvs70bl6t2p645pnydw.png)

## Polimorfismo
O polimorfismo permite que objetos de diferentes tipos possam ser tratados de uma mesma forma, isso é, que uma classe base pode definir métodos que são implementados de maneiras diferentes por suas classes derivadas, permitindo que um método se comporte de maneira diferente.
Podemos ter dois tipos de polimorfismo, são eles: 

## Polimorfismo de sobrecarga (Overloading)
> Esse tipo acontece quando, vários métodos com o mesmo nome existem em uma classe, mas com diferentes parâmetros.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zxwy9v1q03d33walwjw6.png)



## Polimorfismo de subistituição (Overriding)
> Em polimorfismo de subistituição, temos o conceito de herança que permite uma subclasse forneça uma implementação específica de um método que já esta definido na superclasse. Para isso usamos os modificadores Virtual e Override 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qvid6m5hoosawzkx4fdq.png)

## Encapsulamento
É o conceito de proteger os atributos de uma classe, garantindo assim que os dados sejam manipulados de forma mais segura. Para utilizarmos o conceito de encapsulamento temos que utilizar os modificadores de acesso, anteriormente falado nesse artigo.

## Modificadores de Acesso
Os modificadores controlam a visibilidade e a acessibilidade dos atributos da classe, os modificadores são:

> •Public – O atributo e visível em toda parte do código.
> •Private – O atributo e visível somente dentro da própria classe.
> •Protected – O atributo e visível dentro da própria classe e de suas classes derivadas.
> •Internal – O atributo e visível somente dentro do mesmo assembly.

As classes que utilizam o conceito de encapsulamento tem propriedades para controle de acesso e para controle de modificações, são métodos especiais chamados de Getters e Setters.

> •Getters – métodos publico (public) para controle de acesso do atributo.
> •Setters – método publico (public) para controle de modificações do atributo.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phh0sqfcrozya8bck5cs.png)
Por definição quando delcaramos os atributos, colocamos o _ (Underline) na frente do nome. E a primeira letra sempre em letra minúscula, pois quando geramos o Getters e Setters a própria linguagem já modifica a primeira letra para maiúscula.

## Abstração
A abstração é o processo de esconder os detalhes de um objeto, ou seja ela serve como base para uma outra classe. 

> •Uma classe abstrata não pode ser instanciada.
> •Serve apenas como modelo para outra classe.
> •Pode conter métodos abstratos sem implementação, e métodos concretos com implementações.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f17u97fev1p2ymmrqzz9.png)

## Interfaces
Uma interface declara um conjunto de métodos, mais não fornece corpo para esses métodos, com isso a classe que a implemente é quem dá copo ao método. Uma interface pode ser chamada de contrato.

> •Conceitos básicos de Interfaces:
> •Para definir uma interface usamos a palavra ‘Interface’.
> •Pode conter declarações de métodos.
> •Não contem corpo somente assinatura.
> •Qualquer classe que implemente uma interface, obrigatoriamente deve fornecer corpo para os métodos da interface herdada. 
> •Uma classe pode implementar varias interfaces.
> •Interfaces permitem o polimorfismo, permitindo que diferentes classes tratem seus métodos de formas diferentes.

1. Criando a Interface:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d40kgxu64i0a3tnj2o0w.png)

2. Implementando a Interface
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsmres0flgenikat0dr3.png)

E quais as diferenças entre as interfaces e as classes abstratas?
 
Podemos dizer que as interfaces não possuem implementações, apenas declarações o que não ocorre nas classes abstratas, que podem ter implementações parciais ou totais. Outro ponto é, uma classe só pode herdar uma única classe abstrata, mas pode herdar múltiplas interfaces.

## Objetos
Objetos são instancias de classes, permitindo a criação de componentes modulares e reutilizáveis. Cada objeto possui seu próprio conjunto de dados, que são armazenados nos atributos e propriedades definidos pela classe.

Como exemplo vamos usar uma Entidade Pessoa com a visibilidade publica mas utilizando o conceito de encapsulamento dos atributos que são, Nome e Idade.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/57h3p8q5ikwvrf8iwf9n.png)

Podemos fazer a instancia da entidade Pessoa de duas formas, são elas:

1. Primeira forma de instanciar a entidade pessoa.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/43hkuqu5vlfakl3chwfl.png)

> No código acima usamos a palavra reservada “var” para criar uma variável, em seguida colocamos o nome da variável, que no caso é ‘pessoa’, e atribuímos o sinal de = (igual) para informar que, vamos receber os dados da entidade Pessoa(). Para instanciar uma nova classe Pessoa() usamos a palavra reservada “new” logo em seguida o nome da classe ou entidade, nesse caso a entidade Pessoa(). Repare que depois de informarmos a classe/Entidade utilizamos o () (Parênteses), isso significa que podemos colocar parâmetros, mas temos que nos atentar para qual tipo a classe pode receber, que no casso acima é Nome do tipo string e Idade do tipo int.
> Quando fazemos a instanciação de uma classe podemos ver os seus atributos através dos seus métodos públicos, Get (Getters) e Set (Setters), podendo assim atribuir valores aos mesmos. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbmu5rx66osg0bqdpvpr.png)

2. Segunda forma de instanciar a entidade pessoa.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7tlobgzwsu1mnyf68110.png)

> A segunda forma de instanciar a entidade Pessoa é bem parecida com a primeira, a diferença é, que ao invés de usarmos a palavra reservada “var”, criamos o objeto Pessoa e damos o nome de pessoa que vai receber uma nova instancia de Pessoa().

## Conclusão
As classes em C# .NET são fundamentais para a criação de aplicações. Compreender a estrutura, os componentes e os conceitos como herança, polimorfismo e encapsulamento é essencial para qualquer desenvolvedor C#. Através de exemplos, este artigo demonstrou como implementar e utilizar classes, promovendo a reutilização de código e a manutenção de software.