Middle+
Warum ist das Einbetten in der Programmiersprache Go keine Vererbung?
sobes.tech KI
Antwort von AI
Das Einbetten (embedding) in Go ermöglicht es einer Struktur, Felder und Methoden einer anderen Struktur zu verwenden, als wären sie ihre eigenen.
Wesentliche Unterschiede zur Vererbung:
- Komposition vs. Hierarchie: Das Einbetten ist eine Form der Komposition ("hat eine"), bei der eine Struktur hat eine andere. Vererbung (im klassischen OOP) ist eine Hierarchieform ("ist ein"), bei der eine Klasse ist eine Unterklasse einer anderen.
- Polymorphismus: Go unterstützt keinen Subtyp-Polymorphismus im traditionellen Sinne der Vererbung. Polymorphismus in Go wird durch Schnittstellen (Interfaces) realisiert.
- Zugriff: Das Einbetten macht die sichtbaren Felder und Methoden der eingebetteten Struktur direkt über die äußere Struktur zugänglich, schafft aber keine Typ-Hierarchie.
- Fehlen von Überschreibungen: Es gibt keinen direkten Mechanismus zum "Überschreiben" von Methoden der Basisklasse. Man kann eine Methode mit demselben Namen in der äußeren Struktur definieren, die die eingebettete Methode "überschreibt".
Beispiel für das Einbetten:
package main
import "fmt"
type Engine struct {
Cylinders int
}
func (e Engine) Start() {
fmt.Println("Motor gestartet mit", e.Cylinders, "Zylindern")
}
type Car struct {
Engine // Einbettung von Engine
Brand string
}
func main() {
myCar := Car{
Engine: Engine{Cylinders: 4},
Brand: "Toyota",
}
myCar.Start() // Zugriff auf die Methode Start des Engines über Car
fmt.Println("Marke des Autos:", myCar.Brand)
fmt.Println("Zylinder des Motors:", myCar.Cylinders) // Zugriff auf das Feld Cylinders des Engines über Car
}
In diesem Beispiel hat Car einen Engine, aber Car ist kein Subtyp von Engine. Wir greifen einfach bequem auf die Felder und Methoden von Engine über die Struktur Car zu.