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