Junior — Middle
Kako prevodilac određuje koji tačno metod treba pozvati pri preopterećenju ili prepisivanju?
sobes.tech АИ
Одговор од АИ
U Go nema preopterećenja metoda u klasičnom smislu, kao u C++ ili Java. Svaka metoda ili funkcija ima jedinstveno ime u paketu. Ako postoji više funkcija sa istim imenom, ali različitim parametrima, to će izazvati grešku pri kompilaciji.
Što se tiče prepisivanja, Go koristi interfejse: ako tip implementira metode interfejsa, pri pozivu putem interfejsa biće pozvana metoda konkretnog tipa.
Tako, izbor metode se dešava tokom kompilacije na osnovu imena i potpisa funkcije, a dinamički poziv putem interfejsa je određen tipom objekta tokom izvršenja.
Primer:
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() // Ispisaće Woof
s = Cat{}
s.Speak() // Ispisaće Meow
}