Junior — Middle
Ako určuje prekladač, ktorý konkrétny spôsob má zavolať pri preťažovaní alebo prepisovaní?
sobes.tech AI
Odpoveď od AI
V jazyku Go neexistuje preťažovanie metód v klasickom zmysle, ako v C++ alebo Java. Každá metóda alebo funkcia má v balíku jedinečný názov. Ak existuje viacero funkcií s rovnakým názvom, ale rôznymi parametrami, spôsobí to chybu pri kompilácii.
Čo sa týka prepísania, Go používa rozhrania: ak typ implementuje metódy rozhrania, pri volaní cez rozhranie bude volaná metóda konkrétneho typu.
Takže, výber metódy sa deje počas kompilácie na základe názvu a podpisu funkcie, a dynamické volanie cez rozhranie je určené typom objektu počas behu.
Príklad:
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() // Vypíše Woof
s = Cat{}
s.Speak() // Vypíše Meow
}