Sobes.tech
Junior — Middle

Wie bestimmt der Compiler, welche konkrete Methode bei Überladung oder Überschreibung aufgerufen werden soll?

sobes.tech KI

Antwort von AI

In Go gibt es keine Methodenüberladung im klassischen Sinne, wie in C++ oder Java. Jede Methode oder Funktion hat einen eindeutigen Namen im Paket. Wenn es mehrere Funktionen mit demselben Namen, aber unterschiedlichen Parametern gibt, führt dies zu einem Kompilierungsfehler.

Was das Überschreiben betrifft, verwendet Go Schnittstellen: Wenn ein Typ die Methoden einer Schnittstelle implementiert, wird beim Aufruf über die Schnittstelle die Methode des konkreten Typs aufgerufen.

Daher erfolgt die Methodenauswahl zur Compile-Zeit basierend auf dem Namen und der Signatur der Funktion, und der dynamische Aufruf über die Schnittstelle wird zur Laufzeit anhand des Objekttyps bestimmt.

Beispiel:

package main
import "fmt"

type Speaker interface {
    Speak()
}

type Dog struct{}
func (d Dog) Speak() { fmt.Println("Woof") }

type Cat struct{}
func (c Cat) Speak() { fmt.Println("Meow") }

func main() {
    var s Speaker
    s = Dog{}
    s.Speak() // Gibt Woof aus
    s = Cat{}
    s.Speak() // Gibt Meow aus
}