Sobes.tech
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.