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 má 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 má Engine, ale Car nie je podtriedou Engine. Jednoducho získavame pohodlný prístup k poľiam a metódam Engine cez štruktúru Car.