Middle+
Zašto ugrađivanje u jeziku Go nije nasledstvo?
sobes.tech АИ
Одговор од АИ
Ugrađivanje (embedding) u Go omogućava jednoj strukturi da koristi polja i metode druge strukture kao da su njeni sopstveni.
Ključne razlike u odnosu na nasleđivanje:
- Kompozicija vs. Hijerarhija: Ugrađivanje je oblik kompozicije ("ima") gde jedna struktura ima drugu. Nasleđivanje (u klasičnom OOP) je oblik hijerarhije ("je"), gde jedna klasa je podklasa druge.
- Polimorfizam: Go ne podržava polimorfizam podtipova u tradicionalnom smislu nasleđivanja. Polimorfizam u Go se realizuje putem interfejsa.
- Pristup: Ugrađivanje omogućava direktan pristup vidljivim poljima i metodama ugrađene strukture putem spoljašnje strukture, ali ne stvara hijerarhiju tipova.
- Nedostatak override: Ne postoji direktan mehanizam za "prepisivanje" metoda osnovne klase. Možete definisati metodu sa istim imenom u spoljašnjoj strukturi, koja "skriva" ugrađenu metodu.
Primer ugradnje:
package main
import "fmt"
type Engine struct {
Cylinders int
}
func (e Engine) Start() {
fmt.Println("Motor startovan sa", e.Cylinders, "cilindara")
}
type Car struct {
Engine // Ugrađivanje Engine
Brand string
}
func main() {
myCar := Car{
Engine: Engine{Cylinders: 4},
Brand: "Toyota",
}
myCar.Start() // Pristup metodi Start Engine preko Car
fmt.Println("Marka automobila:", myCar.Brand)
fmt.Println("Cilindri motora:", myCar.Cylinders) // Pristup polju Cylinders Engine preko Car
}
U ovom primeru, Car ima Engine, ali Car nije podklasa Engine. Jednostavno dobijamo zgodan pristup poljima i metodama Engine preko strukture Car.