DEV Community

Cover image for Dominando a Orientação a Objetos em C#: Conceitos Fundamentais e Prática
Bruno Pizol Camargo
Bruno Pizol Camargo

Posted on

Dominando a Orientação a Objetos em C#: Conceitos Fundamentais e Prática

Introdução à Orientação a Objetos

O que é Orientação a Objetos?

A Orientação a Objetos (OO) é um paradigma de programação que se baseia na ideia de "objetos", que são instâncias de classes. Ela se concentra na organização do código em torno de objetos que possuem dados (atributos) e comportamentos (métodos). C# é uma linguagem fortemente orientada a objetos.

Paralelo com Structs em C#

Em C#, você também pode usar structs, que são tipos de valor semelhantes às classes, mas a principal diferença é que as structs são alocadas na stack, enquanto as instâncias de classes são alocadas no heap. Classes são mais flexíveis e suportam recursos avançados de OO, como herança e polimorfismo, enquanto structs são mais eficientes em termos de memória.

  1. Stack (Pilha):
    • A área de memória chamada "stack" é uma região de memória de tamanho fixo que é usada para armazenar dados temporários, como variáveis locais de funções e informações de chamada de função.
    • A alocação de memória na stack é relativamente rápida, uma vez que envolve apenas o deslocamento de um ponteiro de pilha.
    • Os dados alocados na stack são automaticamente liberados quando a função que os criou sai de escopo, o que é conhecido como "desalocação automática".
    • No contexto da frase, as structs são alocadas na stack, o que significa que quando uma struct é criada, sua memória é reservada na stack, e quando a função que a criou termina sua execução, a memória é automaticamente liberada.
  2. Heap (Monte):
    • A área de memória chamada "heap" é uma região de memória de tamanho variável que é usada para alocar dados de forma dinâmica, como objetos de classe ou estruturas de dados mais complexas.
    • A alocação de memória no heap envolve um processo mais complexo, já que o programador deve gerenciar manualmente a alocação e desalocação de memória.
    • Os dados alocados no heap não são automaticamente liberados quando não são mais necessários; é responsabilidade do programador liberar essa memória quando terminar de usá-la para evitar vazamentos de memória.
    • No contexto da frase, as instâncias de classes são alocadas no heap, o que significa que, quando você cria um objeto de classe, sua memória é reservada no heap, e é sua responsabilidade liberar essa memória quando não for mais necessária.

Exemplo de Struct em C:

#include <stdio.h>

// Definição de uma struct em C
struct Pessoa {
    char nome[50];
    int idade;
};

int main() {
    // Criando uma instância da struct Pessoa
    struct Pessoa pessoa1;

    // Inicializando os campos da struct
    strcpy(pessoa1.nome, "João");
    pessoa1.idade = 30;

    // Acessando e exibindo os campos da struct
    printf("Nome: %s\\n", pessoa1.nome);
    printf("Idade: %d anos\\n", pessoa1.idade);

    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, estamos usando uma struct chamada Pessoa para armazenar informações sobre uma pessoa, como nome e idade.

Exemplo de Classe em C#:

Aqui está como essa mesma estrutura poderia ser representada como uma classe em C#:

using System;

// Definição de uma classe em C#
public class Pessoa {
    // Campos (ou propriedades) da classe
    public string Nome { get; set; }
    public int Idade { get; set; }

    // Construtor da classe
    public Pessoa(string nome, int idade) {
        Nome = nome;
        Idade = idade;
    }

    // Método para exibir informações da pessoa
    public void ExibirInformacoes() {
        Console.WriteLine($"Nome: {Nome}");
        Console.WriteLine($"Idade: {Idade} anos");
    }

    public static void Main(string[] args) {
        // Criando uma instância da classe Pessoa
        Pessoa pessoa1 = new Pessoa("João", 30);

        // Acessando e exibindo informações da pessoa
        pessoa1.ExibirInformacoes();
    }
}
Enter fullscreen mode Exit fullscreen mode

Neste exemplo em C#, definimos uma classe chamada Pessoa com campos (ou propriedades) para armazenar informações e um construtor para inicializar esses campos. Além disso, há um método ExibirInformacoes que exibe os detalhes da pessoa.

Classes e Métodos

  1. Classes:
    • Imagine uma "receita de biscoito" como uma classe. A classe é uma espécie de modelo ou plano que define como criar biscoitos. Ele contém informações sobre os ingredientes (atributos) e as etapas necessárias para fazer os biscoitos (métodos).
  2. Atributos:
    • Os atributos são como os ingredientes da receita de biscoito. Por exemplo, a quantidade de farinha, açúcar, ovos e chocolate. Esses ingredientes são os atributos da classe. Cada biscoito (objeto) que você faz usando essa receita terá seus próprios valores específicos para esses ingredientes.
  3. Métodos:
    • Os métodos são como as etapas da receita que dizem como preparar a massa, moldar os biscoitos e assá-los. Cada método é uma ação que pode ser executada com base nos atributos da classe. Por exemplo, o método "assar" usa os atributos (ingredientes) para produzir biscoitos cozidos.
  4. Objetos:
    • Os objetos são como biscoitos individuais que você faz usando a receita. Cada objeto é uma instância da classe (receita). Eles compartilham a mesma estrutura definida pela classe (mesmos ingredientes e etapas), mas cada objeto pode ter seus próprios valores de atributos (quantidades diferentes de ingredientes) e pode ser produzido separadamente.
  5. Herança:
    • Imagine que você tem diferentes tipos de biscoitos, como biscoitos de chocolate e biscoitos de baunilha. Você pode criar uma nova classe chamada "BiscoitoDeChocolate" que herda as características (atributos e métodos) da classe base "Biscoito". Assim, você reutiliza a estrutura básica da receita e adiciona ingredientes ou etapas específicos para os biscoitos de chocolate.

Classes

As classes são os blocos de construção fundamentais da orientação a objetos em C#. Elas representam tipos de dados e definem a estrutura (atributos) e o comportamento (métodos) dos objetos.

Exemplo de uma classe simples:

public class Pessoa {
    public string Nome { get; set; }
    public int Idade { get; set; }

    public void Apresentar() {
        Console.WriteLine($"Meu nome é {Nome} e tenho {Idade} anos.");
    }
}
Enter fullscreen mode Exit fullscreen mode

Métodos

Métodos são funções dentro de uma classe que realizam ações ou operações relacionadas a objetos dessa classe.

Exemplo de uso de métodos:

Pessoa pessoa = new Pessoa();
pessoa.Nome = "João";
pessoa.Idade = 30;
pessoa.Apresentar(); // Saída: "Meu nome é João e tenho 30 anos."
Enter fullscreen mode Exit fullscreen mode

Instanciar Objetos

Para usar uma classe e criar objetos, você precisa instanciá-la. Isso envolve a alocação de memória e a inicialização dos atributos.

Pessoa pessoa = new Pessoa();
Enter fullscreen mode Exit fullscreen mode

Aqui, pessoa é uma instância da classe Pessoa.

Garbage Collector

O Garbage Collector (coletor de lixo) em C# é responsável por liberar a memória alocada para objetos que não são mais referenciados, tornando-os elegíveis para coleta.

Você não precisa se preocupar em liberar a memória manualmente, pois o Garbage Collector faz isso automaticamente.

Copiar Objetos Instanciados

Em C#, quando você atribui uma variável de objeto a outra, na verdade está criando uma referência compartilhada para o mesmo objeto, não uma cópia real. Para criar uma cópia independente, você pode implementar o método Clone() ou criar uma nova instância e copiar os valores manualmente.

Herança

A herança permite que uma classe herde atributos e métodos de outra classe, estabelecendo uma relação "é um" entre as classes.

Exemplo de herança:

public class Aluno : Pessoa {
    public string Matricula { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

Neste caso, a classe Aluno herda todos os atributos e métodos da classe Pessoa.

Implementação e Extensão

  • Implementação: Interfaces em C# permitem definir contratos que as classes devem seguir. Uma classe pode implementar várias interfaces, garantindo que ela forneça determinados métodos e propriedades.
public interface IReprodutivel {
    void Reproduzir();
}

public class Gato : IReprodutivel {
    public void Reproduzir() {
        Console.WriteLine("O gato está se reproduzindo.");
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Extensão: Você pode estender classes existentes sem modificá-las usando métodos de extensão. Isso é útil para adicionar funcionalidades sem alterar o código fonte original.
public static class StringExtensions {
    public static bool ÉNuloOuVazio(this string texto) {
        return string.IsNullOrEmpty(texto);
    }
}
Enter fullscreen mode Exit fullscreen mode

Prós e Contras da Orientação a Objetos em C

Prós:

  • Encapsulamento: Ajuda a proteger dados sensíveis.
  • Reutilização de Código: Classes e herança permitem reutilização de código.
  • Manutenção: Facilita a manutenção do código.
  • Abstração: Permite representar conceitos do mundo real.

Contras:

  • Complexidade: Pode resultar em código complexo se não for bem projetado.
  • Desempenho: Pode ser menos eficiente do que abordagens mais simples em alguns casos.
  • Curva de Aprendizado: Pode ser desafiador para iniciantes.

A orientação a objetos é uma parte fundamental do desenvolvimento em C# e é amplamente usada na construção de aplicativos modernos. É importante entender os conceitos e práticas de OO para tirar o máximo proveito dessa linguagem.

Exercícios:

  1. Crie uma classe chamada Círculo que represente um círculo e inclua métodos para calcular a área e o perímetro.
  2. Implemente uma classe ContaBancária com métodos para depósito, saque e exibição do saldo atual.
  3. Crie uma hierarquia de classes para representar diferentes tipos de veículos, como carro, bicicleta e caminhão, com métodos para acelerar, desacelerar e parar.

Como gostaria de proceder?

Top comments (0)