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 má 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.