Sobes.tech
Middle+

Por que a incorporação na linguagem Go não é herança?

sobes.tech IA

Resposta da IA

A incorporação (embedding) em Go permite que uma estrutura utilize os campos e métodos de outra estrutura como se fossem seus.

Principais diferenças em relação à herança:

  • Composição vs. Hierarquia: A incorporação é uma forma de composição ("tem uma"), onde uma estrutura tem outra. A herança (no paradigma clássico de POO) é uma forma de hierarquia ("é um"), onde uma classe é uma subclasse de outra.
  • Polimorfismo: Go não suporta polimorfismo de subtipos no sentido tradicional de herança. O polimorfismo em Go é implementado através de interfaces.
  • Acesso: A incorporação torna acessíveis diretamente os campos e métodos visíveis da estrutura incorporada através da estrutura externa, mas não cria uma hierarquia de tipos.
  • Ausência de sobrescrita: Não há um mecanismo direto de "sobrescrita" de métodos da classe base. Pode-se definir um método com o mesmo nome na estrutura externa, que "ocultará" o método incorporado.

Exemplo de incorporação:

package main

import "fmt"

type Engine struct {
	Cylinders int
}

func (e Engine) Start() {
	fmt.Println("Motor iniciado com", e.Cylinders, "cilindros")
}

type Car struct {
	Engine // Incorporação de Engine
	Brand  string
}

func main() {
	myCar := Car{
		Engine: Engine{Cylinders: 4},
		Brand:  "Toyota",
	}
	myCar.Start() // Acesso ao método Start do Engine via Car
	fmt.Println("Marca do carro:", myCar.Brand)
	fmt.Println("Cilindros do motor:", myCar.Cylinders) // Acesso ao campo Cylinders do Engine via Car
}

Neste exemplo, Car tem um Engine, mas Car não é uma subclasse de Engine. Simplesmente acessamos de forma conveniente os campos e métodos de Engine através da estrutura Car.