Junior — Middle
Hogyan határozza meg a fordító, hogy melyik konkrét metódust hívja meg túlterhelés vagy felülírás esetén?
sobes.tech MI
Válasz az MI-től
A Go nyelvben nincs módszertúlterhelés a klasszikus értelemben, mint C++ vagy Java esetén. Minden módszer vagy függvény egyedi névvel rendelkezik a csomagon belül. Ha több függvény van ugyanazzal a névvel, de különböző paraméterekkel, az fordítási hibát eredményez.
A felülírás tekintetében a Go interfészeket használ: ha egy típus megvalósítja egy interfész metódusait, akkor az interfészen keresztül történő híváskor a konkrét típus metódusa lesz meghívva.
Így a módszer kiválasztása fordítási időben történik a függvény neve és szignatúrája alapján, míg a dinamikus hívás az interfészen keresztül a futási időben az objektum típusától függ.
Példa:
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() // Kiírja Woof
s = Cat{}
s.Speak() // Kiírja Meow
}