Middle+
Perché l'inclusione nel linguaggio Go non è ereditarietà?
sobes.tech AI
Risposta dell'AI
L'incorporamento (embedding) in Go consente a una struttura di utilizzare i campi e i metodi di un'altra struttura come se fossero propri.
Differenze chiave rispetto all'ereditarietà:
- Composizione vs. Gerarchia: L'incorporamento è una forma di composizione ("ha un"), dove una struttura possiede un'altra. L'ereditarietà (nel paradigma OOP classico) è una forma di gerarchia ("è un"), dove una classe è una sottoclasse di un'altra.
- Polimorfismo: Go non supporta il polimorfismo di sottotipo nel senso tradizionale di ereditarietà. Il polimorfismo in Go si realizza tramite interfacce.
- Accesso: L'incorporamento rende accessibili direttamente i campi e i metodi visibili della struttura incorporata tramite la struttura esterna, ma non crea una gerarchia di tipi.
- Mancanza di override: Non esiste un meccanismo diretto di "override" dei metodi della classe base. È possibile definire un metodo con lo stesso nome nella struttura esterna, che "oscura" il metodo incorporato.
Esempio di incorporamento:
package main
import "fmt"
type Engine struct {
Cylinders int
}
func (e Engine) Start() {
fmt.Println("Motore avviato con", e.Cylinders, "cilindri")
}
type Car struct {
Engine // Incorporamento di Engine
Brand string
}
func main() {
myCar := Car{
Engine: Engine{Cylinders: 4},
Brand: "Toyota",
}
myCar.Start() // Accesso al metodo Start di Engine tramite Car
fmt.Println("Marca dell'auto:", myCar.Brand)
fmt.Println("Cilindri del motore:", myCar.Cylinders) // Accesso al campo Cylinders di Engine tramite Car
}
In questo esempio, Car possiede un Engine, ma Car non è una sottoclasse di Engine. Accediamo semplicemente in modo conveniente ai campi e ai metodi di Engine tramite la struttura Car.