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