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
}