DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

POO: Interfaces

Introdução

Um contrato puro. Tradicionalmente, zero implementação, zero estado só a assinatura do que um tipo promete saber fazer.

interface IAutonomo
{
    void Pilotar();
}

interface IEletrico
{
    double NivelBateria { get; }   // interface também pode ter propriedade, não só método
    void Recarregar();
}
Enter fullscreen mode Exit fullscreen mode

Repare: dentro da interface você não escreve public — todo membro de interface já é implicitamente público, e você não pode restringir isso.

Uma classe pode implementar quantas interfaces quiser, além de herdar de uma única classe base:

class CarroAutonomo : Veiculo, IAutonomo, IEletrico
{
    private double _bateria = 100;

    public CarroAutonomo(string placa) : base(placa) { }

    public override void DescreverModo() => Console.WriteLine("Modo carro autônomo elétrico.");

    public void Pilotar() => Console.WriteLine("🤖 Dirigindo sozinho, sem motorista.");

    public double NivelBateria => _bateria;

    public void Recarregar()
    {
        _bateria = 100;
        Console.WriteLine("🔋 Bateria recarregada.");
    }
}
Enter fullscreen mode Exit fullscreen mode

O nugget mais avançado: implementação explícita de interface, pra resolver conflito quando duas interfaces têm método com o mesmo nome:

interface IRelatorioFrota { string GerarRelatorio(); }
interface IRelatorioManutencao { string GerarRelatorio(); } // mesmo nome, contratos diferentes!

class Caminhao : Veiculo, IRelatorioFrota, IRelatorioManutencao
{
    public Caminhao(string placa) : base(placa) { }
    public override void DescreverModo() => Console.WriteLine("Modo caminhão: carga pesada.");

    // Implementação EXPLÍCITA: só acessível através do tipo da interface, não direto no objeto
    string IRelatorioFrota.GerarRelatorio() => "Relatório de frota: em rota";
    string IRelatorioManutencao.GerarRelatorio() => "Relatório de manutenção: revisão pendente";
}
Enter fullscreen mode Exit fullscreen mode
Caminhao c = new Caminhao("CMN-01");

IRelatorioFrota rf = c;
Console.WriteLine(rf.GerarRelatorio()); // "Relatório de frota: em rota"

IRelatorioManutencao rm = c;
Console.WriteLine(rm.GerarRelatorio()); // "Relatório de manutenção: revisão pendente"

// c.GerarRelatorio() direto → ❌ nem compila, é ambíguo demais pra existir sem o "casting"
Enter fullscreen mode Exit fullscreen mode

Interface Marcadora (marker interface)

Sem a implementação explícita, o compilador nem saberia qual das duas assinaturas você quis dizer. Com ela, cada versão "mora" dentro do tipo da interface específica.

Interface marcadora (marker interface): uma interface vazia, sem nenhum membro, usada só pra "carimbar" um tipo:

interface IInspecionavel { } // vazia de propósito

class Caminhao : Veiculo, IInspecionavel { /* ... */ }
Enter fullscreen mode Exit fullscreen mode
if (veiculo is IInspecionavel) 
    Console.WriteLine("Precisa passar por inspeção periódica.");
Enter fullscreen mode Exit fullscreen mode

Top comments (0)