C# POO Básico
Herança e polimorfismo
Em C#, herança permite que uma classe reutilize membros de outra, criando uma relação "é um". A classe base define comportamentos comuns, e a derivada pode especializá-los. Já o polimorfismo permite tratar objetos de classes derivadas como se fossem da classe base, chamando métodos que se comportam de forma diferente conforme o tipo real.
Para que um método possa ser sobrescrito, ele precisa ser marcado como virtual na classe base e override na derivada. Classes e membros abstract estabelecem um contrato que as classes derivadas devem implementar, sem fornecer uma implementação padrão. Já sealed impede que uma classe seja herdada ou que um método sobrescrito seja novamente sobrescrito.
Esses recursos formam a base do design orientado a objetos em C#, permitindo código flexível, extensível e fácil de manter. Neste card, você verá exemplos práticos de cada um e como combiná-los.
Pontos-chave
- Herança usa
:para indicar que uma classe deriva de outra. virtualpermite sobrescrever um método;overrideimplementa a sobrescrita.abstractdefine membros sem implementação que devem ser sobrescritos.sealedimpede herança adicional ou sobrescrita de um método.- Polimorfismo permite chamar o método correto em tempo de execução via referência da base.
using System;
abstract class Animal
{
public string Nome { get; set; }
public Animal(string nome) => Nome = nome;
// Método abstrato: obrigatório nas classes derivadas
public abstract void EmitirSom();
// Método virtual: pode ser sobrescrito, mas tem padrão
public virtual void Apresentar()
{
Console.WriteLine($"Olá, eu sou {Nome}.");
}
}
class Cachorro : Animal
{
public Cachorro(string nome) : base(nome) { }
public override void EmitirSom() => Console.WriteLine("Woof!");
}
class Gato : Animal
{
public Gato(string nome) : base(nome) { }
public override void EmitirSom() => Console.WriteLine("Miau!");
// Sobrescreve o método virtual
public override void Apresentar()
{
Console.WriteLine($"Eu sou o gato {Nome}.");
}
}
// Classe sealed: não pode ser herdada
sealed class Passaro : Animal
{
public Passaro(string nome) : base(nome) { }
public override void EmitirSom() => Console.WriteLine("Piu!");
}
class Program
{
static void Main()
{
Animal[] animais = { new Cachorro("Rex"), new Gato("Mimi"), new Passaro("Piu") };
foreach (var animal in animais)
{
animal.Apresentar();
animal.EmitirSom();
Console.WriteLine();
}
}
}