Sobes.tech
Middle+

Proč vkládání v jazyce Go není dědičnost?

sobes.tech AI

Odpověď od AI

Vložení (embedding) v Go umožňuje jedné struktuře používat pole a metody jiné struktury, jako by byly její vlastní.

Klíčové rozdíly od dědičnosti:

  • Složení vs. Hierarchie: Vložení je forma složení ("má"), kde jedna struktura jinou. Dědičnost (v klasickém OOP) je forma hierarchie ("je"), kde jedna třída je podtřídou jiné.
  • Polymorfismus: Go nepodporuje polymorfismus podtypů v tradičním smyslu dědičnosti. Polymorfismus v Go je realizován přes rozhraní.
  • Přístup: Vložení umožňuje přímo přistupovat k viditelným polím a metodám vložené struktury přes vnější strukturu, ale nevytváří hierarchii typů.
  • Chybí override: Neexistuje přímý mechanismus "přepsání" metod základní třídy. Můžete definovat metodu se stejným názvem ve vnější struktuře, která "skryje" vloženou metodu.

Příklad vložení:

package main

import "fmt"

type Engine struct {
	Cylinders int
}

func (e Engine) Start() {
	fmt.Println("Motor spuštěn s", e.Cylinders, "válci")
}

type Car struct {
	Engine // Vložení Engine
	Brand  string
}

func main() {
	myCar := Car{
		Engine: Engine{Cylinders: 4},
		Brand:  "Toyota",
	}
	myCar.Start() // Přístup ke Start metodě Engine přes Car
	fmt.Println("Značka auta:", myCar.Brand)
	fmt.Println("Válce motoru:", myCar.Cylinders) // Přístup k poli Cylinders Engine přes Car
}

V tomto příkladu má Car vlastní Engine, ale Car není podtřídou Engine. Jednoduše získáváme pohodlný přístup k polím a metodám Engine přes strukturu Car.