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.
- Crie o arquivo
rpg_interfaces.gona pastasrc/:
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
- Abra o terminal integrado.
- 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)
}