Middle+
Miks Go keeles sisestamine ei ole pärandamine?
sobes.tech AI
Vastus AI-lt
Go-sises võimaldab sisestamine (embedding) ühe struktuuri kasutada teise struktuuri välju ja meetodeid nagu need oleksid tema omad.
Peamised erinevused pärilusega:
- Koostöö vs. Hierarhia: Sisestamine on koostöövorm („has-a“), kus üks struktuur omab teist. Pärilusus (klassikalises OOP-s) on hierarhia vorm („is-a“), kus üks klass on teise alklass.
- Polümorfism: Go ei toeta päriluse traditsioonilist alamtüüpi polümorfismi. Polümorfism realiseeritakse Go-s läbi liidestega.
- Juurdepääs: Sisestamine teeb sisseehitatud struktuuri väljad ja nähtavad meetodid otse välise struktuuri kaudu kättesaadavaks, kuid see ei loo tüüpi hierarhiat.
- Üle kirjutamise puudumine: Ei ole otsest mehhanismi „meetodite ülekirjutamiseks“ baasklassist. Võid määratleda meetodi sama nimega välise struktuuri sees, mis varjab sisseehitatud meetodi.
Näide sisestamisest:
package main
import "fmt"
type Engine struct {
Cylinders int
}
func (e Engine) Start() {
fmt.Println("Mootor käivitus koos", e.Cylinders, "tsilindriga")
}
type Car struct {
Engine // Sisestamine Engine
Brand string
}
func main() {
myCar := Car{
Engine: Engine{Cylinders: 4},
Brand: "Toyota",
}
myCar.Start() // Juurdepääs Engine Start meetodile Car kaudu
fmt.Println("Auto bränd:", myCar.Brand)
fmt.Println("Mootor tsilindrid:", myCar.Cylinders) // Juurdepääs Engine väljal Cylinders Car kaudu
}
Selles näites omab Car Engine, kuid Car ei ole Engine alamtüüp. Me lihtsalt saame mugavalt juurde pääseda Engine väljadele ja meetoditele Car kaudu.