Sobes.tech
Middle+

Prečo vkladanie v jazyku Go nie je dedičstvo?

sobes.tech AI

Odpoveď od AI

Vkladanie (embedding) v Go umožňuje jednej štruktúre používať polia a metódy inej štruktúry, akoby boli jej vlastné.

Kľúčové rozdiely od dedičstva:

  • Kompozícia vs. Hierarchia: Vkladanie je forma kompozície ("má"), kde jedna štruktúra inú. Dedičstvo (v klasickom OOP) je forma hierarchie ("je"), kde jedna trieda je podtriedou inej.
  • Polymorfizmus: Go nepodporuje polymorfizmus podtypov v tradičnom zmysle dedičstva. Polymorfizmus v Go je realizovaný cez rozhrania.
  • Prístup: Vkladanie umožňuje priamy prístup k viditeľným poliam a metódam vloženej štruktúry cez vonkajšiu štruktúru, ale nevytvára hierarchiu typov.
  • Chýba override: Neexistuje priame mechanizmus "prepísania" metód základnej triedy. Môžete definovať metódu s rovnakým názvom v vonkajšej štruktúre, ktorá "skryje" vloženú metódu.

Príklad vkladania:

package main

import "fmt"

type Engine struct {
	Cylinders int
}

func (e Engine) Start() {
	fmt.Println("Motor spustený s", e.Cylinders, "valcami")
}

type Car struct {
	Engine // Vloženie Engine
	Brand  string
}

func main() {
	myCar := Car{
		Engine: Engine{Cylinders: 4},
		Brand:  "Toyota",
	}
	myCar.Start() // Prístup ku metóde Start Engine cez Car
	fmt.Println("Značka auta:", myCar.Brand)
	fmt.Println("Valce motora:", myCar.Cylinders) // Prístup k poľu Cylinders Engine cez Car
}

V tomto príklade, Car Engine, ale Car nie je podtriedou Engine. Jednoducho získavame pohodlný prístup k poľiam a metódam Engine cez štruktúru Car.