Médio Go
Promoção de métodos
Enunciado
Crie uma struct Motor com um método Ligar() que imprime "Motor ligado". Crie uma struct Carro que embuta Motor e tenha um método Andar() que imprime "Carro andando". No main, instancie um Carro e chame tanto Ligar() quanto Andar() diretamente no carro.
Requisitos
Motordeve ter o métodoLigar().Carrodeve embutirMotore ter o métodoAndar().- No
main, chamecarro.Ligar()ecarro.Andar()e imprima as mensagens.
Código inicial
package main
import "fmt"
// Defina Motor e Carro aqui
func main() {
// Crie um Carro e chame os métodos
}
Saída esperada
Motor ligado
Carro andando
Ver dica
O método Ligar do Motor será promovido para Carro. Basta chamar carro.Ligar().
Mostrar solução
package main
import "fmt"
type Motor struct{}
func (m Motor) Ligar() {
fmt.Println("Motor ligado")
}
type Carro struct {
Motor // embedding
}
func (c Carro) Andar() {
fmt.Println("Carro andando")
}
func main() {
carro := Carro{}
carro.Ligar() // método promovido de Motor
carro.Andar() // método próprio de Carro
}
Passo a passo
- Definimos
Motorcomo uma struct vazia (poderia ter campos). - Adicionamos o método
Ligarcom receptorMotor. - Definimos
CarroembutindoMotor. - Adicionamos o método
Andarcom receptorCarro. - No
main, criamos umCarroe chamamosLigar()eAndar(). Ligar()é promovido doMotorembutido;Andar()é do próprioCarro.
Por que funciona
O embedding promove métodos do tipo embutido para o tipo externo. Assim, carro.Ligar() é traduzido para carro.Motor.Ligar(). Isso permite compor comportamentos sem herança.
Erros comuns
- Esquecer o receptor: definir
func Ligar()sem receptor não é método, é função. Não será promovido. - Usar ponteiro desnecessariamente: se o método tem receptor de valor, funciona com valor e ponteiro. Mas se o método tem receptor de ponteiro, você precisa de um ponteiro para o tipo externo para chamá-lo.
- Nome conflitante: se
Carrotambém tivesse um métodoLigar, ele sobrescreveria o promovido.
Outra forma de resolver
Poderia chamar explicitamente carro.Motor.Ligar(), mas a promoção torna o código mais limpo.
Saída esperada
Motor ligado
Carro andando