💻 Exemplos: Capítulo 11: Herança, Polimorfismo e Default Interface Methods

Especialização em Sistemas com C# • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Apresentar o polimorfismo orientado a objetos moderno no .NET: classes abstratas com métodos virtuais, especialização com override e bloqueio de herança com sealed, e a utilização de Default Interface Methods (DIM) introduzidos no C# 8+ para evolução não-destrutiva de contratos de API.


1. Código Fonte Completo (Program.cs)

/**
 * @file Program.cs
 * @brief Polimorfismo dinâmico, classes abstratas e Default Interface Methods em C# 12.
 */

using System;
using System.Collections.Generic;

Console.WriteLine("=== CAPÍTULO 11: POLIMORFISMO E INTERFACES MODERNAS ===");

// 1. Interface com Default Interface Method (DIM)
public interface ICanalNotificacao
{
    string NomeCanal { get; }
    void Transmitir(string mensagem);

    // Método com implementação padrão: classes filhas podem usá-lo sem sobrescrever!
    void NotificarEmergencia(string alerta)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Transmitir($"[EMERGÊNCIA CRÍTICA - {NomeCanal.ToUpper()}]: {alerta}");
        Console.ResetColor();
    }
}

// 2. Classe Base Abstrata Polimórfica
public abstract class SubsistemaBase(string id)
{
    public string Id { get; } = id;

    // Método concreto compartilhado
    public void Inicializar()
    {
        Console.WriteLine($"[BOOT] Inicializando subsistema '{Id}'...");
        ExecutarBootstrap();
    }

    // Método abstrato obrigatório para classes filhas
    protected abstract void ExecutarBootstrap();

    // Método virtual opcional
    public virtual string ObterDiagnostico() => $"Subsistema {Id}: Status Nominal";
}

// 3. Implementação Concreta 1
public sealed class CanalEmail(string servidorSmtp) : SubsistemaBase("NotificadorEmail"), ICanalNotificacao
{
    public string NomeCanal => "EmailSMTP";

    protected override void ExecutarBootstrap()
    {
        Console.WriteLine($"  -> Conectando ao servidor SMTP {servidorSmtp}...");
    }

    public void Transmitir(string mensagem)
    {
        Console.WriteLine($"[SMTP] Enviando email corporativo: '{mensagem}'");
    }

    public override string ObterDiagnostico() => $"{base.ObterDiagnostico()} (Fila SMTP: 0 msgs)";
}

// 4. Implementação Concreta 2
public sealed class CanalWebhook(string urlEndpoint) : SubsistemaBase("NotificadorWebhook"), ICanalNotificacao
{
    public string NomeCanal => "HttpWebhook";

    protected override void ExecutarBootstrap()
    {
        Console.WriteLine($"  -> Validando URL Webhook: {urlEndpoint}...");
    }

    public void Transmitir(string mensagem)
    {
        Console.WriteLine($"[HTTP POST] Payload JSON despachado para {urlEndpoint}: '{mensagem}'");
    }
}

// Execução Polimórfica
List<SubsistemaBase> subsistemas = new()
{
    new CanalEmail("smtp.datacenter.internal"),
    new CanalWebhook("https://api.empresa.com/alerts")
};

Console.WriteLine("\n--- 1. Inicialização Polimórfica de Subsistemas ---");
foreach (var sub in subsistemas)
{
    sub.Inicializar();
    Console.WriteLine(sub.ObterDiagnostico());
}

Console.WriteLine("\n--- 2. Transmissão Polimórfica via Interface ---");
foreach (var sub in subsistemas)
{
    if (sub is ICanalNotificacao canal)
    {
        canal.Transmitir("Backup concluido com sucesso.");
        // Invoca o Default Interface Method!
        canal.NotificarEmergencia("Queda de energia no gerador diesel!");
    }
}

2. Instruções de Compilação e Execução

dotnet new console -n AppPolimorfismo -f net8.0
cd AppPolimorfismo
dotnet run

3. Saída Esperada no Terminal

=== CAPÍTULO 11: POLIMORFISMO E INTERFACES MODERNAS ===

--- 1. Inicialização Polimórfica de Subsistemas ---
[BOOT] Inicializando subsistema 'NotificadorEmail'...
  -> Conectando ao servidor SMTP smtp.datacenter.internal...
Subsistema NotificadorEmail: Status Nominal (Fila SMTP: 0 msgs)
[BOOT] Inicializando subsistema 'NotificadorWebhook'...
  -> Validando URL Webhook: https://api.empresa.com/alerts...
Subsistema NotificadorWebhook: Status Nominal

--- 2. Transmissão Polimórfica via Interface ---
[SMTP] Enviando email corporativo: 'Backup concluido com sucesso.'
[EMERGÊNCIA CRÍTICA - EMAILSMTP]: Queda de energia no gerador diesel!
[HTTP POST] Payload JSON despachado para https://api.empresa.com/alerts: 'Backup concluido com sucesso.'
[EMERGÊNCIA CRÍTICA - HTTPWEBHOOK]: Queda de energia no gerador diesel!