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

  • Motor deve ter o método Ligar().
  • Carro deve embutir Motor e ter o método Andar().
  • No main, chame carro.Ligar() e carro.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

  1. Definimos Motor como uma struct vazia (poderia ter campos).
  2. Adicionamos o método Ligar com receptor Motor.
  3. Definimos Carro embutindo Motor.
  4. Adicionamos o método Andar com receptor Carro.
  5. No main, criamos um Carro e chamamos Ligar() e Andar().
  6. Ligar() é promovido do Motor embutido; Andar() é do próprio Carro.

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 Carro também tivesse um método Ligar, 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