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.