Capítulo 11: Interfaces (Polimorfismo) 🛡️🔮

Neste capítulo, vamos aprender sobre as Interfaces do Go. Elas nos permitem definir comportamentos comuns para tipos diferentes, com o tema de Classes de RPG!


📖 O que são Interfaces?

Uma interface define um conjunto de métodos (ações). Se uma struct possui todos os métodos que a interface exige, dizemos que ela “implementa” essa interface.

O grande diferencial do Go é que a implementação é implícita. Você não precisa usar uma palavra-chave como implements do Java ou C#. Se você criou os métodos, o Go já sabe que a struct segue a interface!


📖 Exemplo Guiado: O Poder de Atacar

Vamos criar uma interface chamada Atacante e implementá-la para as structs Guerreiro e Mago.

  1. Crie o arquivo rpg_interfaces.go na pasta src/:
package main
 
import "fmt"
 
// Definindo a Interface
type Atacante interface {
    Atacar() // Qualquer tipo com este método implementa a interface
}
 
type Guerreiro struct {
    Nome string
}
 
// Guerreiro implementa Atacante
func (g Guerreiro) Atacar() {
    fmt.Println(g.Nome, "atacou com a Espada Gigante! ⚔️")
}
 
type Mago struct {
    Nome string
}
 
// Mago implementa Atacante
func (m Mago) Atacar() {
    fmt.Println(m.Nome, "lancou uma Bola de Fogo! 🔥")
}
 
// Função que aceita QUALQUER Atacante
func realizarTurno(a Atacante) {
    a.Atacar()
}
 
func main() {
    heroi1 := Guerreiro{Nome: "Arthur"}
    heroi2 := Mago{Nome: "Merlin"}
 
    fmt.Println("--- Turno de Batalha ---")
    
    // Ambas as structs funcionam na mesma função!
    realizarTurno(heroi1)
    realizarTurno(heroi2)
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o terminal integrado.
  2. Execute: go run rpg_interfaces.go

Resultado Esperado:

--- Turno de Batalha ---
Arthur atacou com a Espada Gigante! ⚔️
Merlin lancou uma Bola de Fogo! 🔥

📊 Ilustração Visual: Interfaces

A interface serve como um contrato implícito:

classDiagram
    class Atacante {
        "<<interface>>"
        +Atacar()
    }
    class Guerreiro {
        +String Nome
        +Atacar()
    }
    class Mago {
        +String Nome
        +Atacar()
    }
    Atacante <|.. Guerreiro : implementa
    Atacante <|.. Mago : implementa

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

Crie uma interface chamada Curador com o método Curar(). Implemente essa interface para uma struct Clerigo (exibindo “Clérigo usou magia de cura”) e para uma struct Pocao (exibindo “Você bebeu a poção”). Crie uma função fazerCura(c Curador) e teste ambas na main!


🔑 Gabarito de Código

Prática 1: interfaces_cura.go

package main
 
import "fmt"
 
type Curador interface {
    Curar()
}
 
type Clerigo struct{}
 
func (c Clerigo) Curar() {
    fmt.Println("Clerigo usou magia de cura! ✨")
}
 
type Pocao struct{}
 
func (p Pocao) Curar() {
    fmt.Println("Voce bebeu a pocao e recuperou vida! 🧪")
}
 
func fazerCura(c Curador) {
    c.Curar()
}
 
func main() {
    var c Clerigo
    var p Pocao
 
    fazerCura(c)
    fazerCura(p)
}

Capitulo Anterior | Proximo Capitulo