💻 Exemplos: Capítulo 11: Herança, Polimorfismo e Default Interface Methods
💻 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!