Sobes.tech
Junior — Middle

Kaip kompiliatorius nustato, kurį konkretų metodą iškviesti, kai yra perkrovimas ar perrašymas?

sobes.tech AI

Atsakymas iš AI

Go kalboje nėra metodų perkėlimo klasikine prasme, kaip C++ ar Java. Kiekvienas metodas ar funkcija turi unikalų pavadinimą pakete. Jei yra keli funkcijos su tuo pačiu pavadinimu, bet skirtingais parametrais, tai sukels kompiliatoriaus klaidą.

Kalbant apie perrašymą, Go naudoja sąsajas: jei tipas įgyvendina sąsajos metodus, tai kviečiant per sąsają, bus iškviestas konkretaus tipo metodas.

Taigi, metodo pasirinkimas vyksta kompiliacijos metu pagal funkcijos pavadinimą ir parašą, o dinaminis iškvietimas per sąsają yra nustatomas pagal objekto tipą vykdymo metu.

Pavyzdys:

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() // Išves Woof
    s = Cat{}
    s.Speak() // Išves Meow
}