Sobes.tech
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
}