Capítulo 12: Polimorfismo e Interfaces 🛡️🔮

Neste capítulo, vamos aprender sobre Polimorfismo e Interfaces no C#. Eles nos permitem tratar objetos diferentes de forma padronizada, com o tema de Batalha de RPG!


📖 O que é Polimorfismo?

Polimorfismo significa “muitas formas”. É a capacidade de um objeto ser tratado como se fosse de outro tipo. Por exemplo, um Mago e um Guerreiro podem ser tratados apenas como “Atacantes”.

📖 O que é uma Interface?

Uma interface é um contrato. Ela diz quais métodos uma classe DEVE ter, mas não diz como eles funcionam. No C#, por convenção, o nome de toda interface começa com a letra I.


📖 Exemplo Guiado: O Contrato de Ataque

Vamos criar uma interface IAtacante e fazer o Guerreiro e o Mago implementarem essa interface.

  1. Crie o arquivo rpg_polimorfismo.cs na pasta src/:
using System;
 
// Código principal
// Criando uma lista de Atacantes (Polimorfismo!)
IAtacante[] equipe = {
    new Guerreiro("Arthur"),
    new Mago("Merlin")
};
 
Console.WriteLine("--- Turno de Batalha ---");
foreach (IAtacante atacante in equipe) {
    atacante.Atacar(); // Cada um ataca do seu jeito!
}
 
// Definindo a Interface
public interface IAtacante {
    void Atacar(); // Método sem corpo
}
 
public class Guerreiro : IAtacante {
    public string Nome { get; set; }
    
    public Guerreiro(string nome) { Nome = nome; }
 
    public void Atacar() {
        Console.WriteLine($"{Nome} atacou com a espada! ⚔️");
    }
}
 
public class Mago : IAtacante {
    public string Nome { get; set; }
    
    public Mago(string nome) { Nome = nome; }
 
    public void Atacar() {
        Console.WriteLine($"{Nome} lancou um feitico! 🔥");
    }
}

🕹️ Como Executar e Testar no VS Code

  1. Execute o projeto usando dotnet run.

Resultado Esperado:

--- Turno de Batalha ---
Arthur atacou com a espada! ⚔️
Merlin lancou um feitico! 🔥

📊 Ilustração Visual: Interfaces

A interface serve como um contrato:

classDiagram
    class IAtacante {
        "<<interface>>"
        +Atacar()
    }
    class Guerreiro {
        +Atacar()
    }
    class Mago {
        +Atacar()
    }
    IAtacante <|.. Guerreiro
    IAtacante <|.. Mago

🛠️ Prática Obrigatória 1: Habilidade de Curar

Crie uma interface chamada ICurador com o método Curar(). Implemente essa interface para uma classe Clerigo (exibindo “Clérigo usou magia de cura”) e para uma classe Pocao (exibindo “Você bebeu a poção”). Crie um array de ICurador e use um laço para fazer todos curarem!


🔑 Gabarito de Código

Prática 1: interfaces_cura.cs

using System;
 
ICurador[] curadores = { new Clerigo(), new Pocao() };
 
foreach (ICurador c in curadores) {
    c.Curar();
}
 
public interface ICurador {
    void Curar();
}
 
public class Clerigo : ICurador {
    public void Curar() {
        Console.WriteLine("Clerigo usou magia de cura! ✨");
    }
}
 
public class Pocao : ICurador {
    public void Curar() {
        Console.WriteLine("Voce bebeu a pocao e recuperou vida! 🧪");
    }
}

Capitulo Anterior | Proximo Capitulo