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();
}
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.");
}
}
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";
}
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"
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 { /* ... */ }
if (veiculo is IInspecionavel)
Console.WriteLine("Precisa passar por inspeção periódica.");
Top comments (0)