Middle+
Kodėl įterpimas Go kalboje nėra paveldėjimas?
sobes.tech AI
Atsakymas iš AI
Įdiegimas (embedding) Go leidžia vienai struktūrai naudoti kitos struktūros laukus ir metodus tarsi jie būtų jos nuosavybė.
Pagrindiniai skirtumai nuo paveldėjimo:
- Sudėtis vs. Hierarchija: Įdiegimas yra sudėties forma ("turi"), kur viena struktūra turi kitą. Paveldėjimas (klasikinėje OOP) yra hierarchijos forma ("yra"), kur viena klasė yra kitos pogrupis.
- Polimorfizmas: Go nepalaiko subtipų polimorfizmo tradiciniame paveldėjimo prasme. Polimorfizmas Go įgyvendinamas per sąsajas.
- Prieiga: Įdiegimas leidžia tiesiogiai pasiekti matomus įdiegto struktūros laukus ir metodus per išorinę struktūrą, bet nesukuria tipų hierarchijos.
- Perrašymas nėra: Nėra tiesioginio mechanizmo "perrašyti" bazinės klasės metodus. Galite apibrėžti tą patį metodą su tuo pačiu pavadinimu išorinėje struktūroje, kuris "paslėps" įdiegto metodo funkcionalumą.
Pavyzdys su įdiegimu:
package main
import "fmt"
type Engine struct {
Cylinders int
}
func (e Engine) Start() {
fmt.Println("Variklis pradėjo darbą su", e.Cylinders, "cilindrais")
}
type Car struct {
Engine // Įdiegimas Engine
Brand string
}
func main() {
myCar := Car{
Engine: Engine{Cylinders: 4},
Brand: "Toyota",
}
myCar.Start() // Prieiga prie Engine Start metodo per Car
fmt.Println("Automobilio markė:", myCar.Brand)
fmt.Println("Variklio cilindrų skaičius:", myCar.Cylinders) // Prieiga prie Engine laukų per Car
}
Šiame pavyzdyje Car turi Engine, bet Car nėra Engine pogrupis. Mes paprasčiausiai patogiai pasiekiame Engine laukus ir metodus per Car struktūrą.