Sobes.tech
Junior — Middle

Kuidas määrab kompilaator, millist konkreetset meetodit kutsuda, kui on ülekoormus või ülekirjutamine?

sobes.tech AI

Vastus AI-lt

Go keeles puudub meetodite ülekoormamine klassikalises mõttes, nagu C++ või Java. Iga meetod või funktsioon omab paketis unikaalset nime. Kui on mitu funktsiooni sama nimega, kuid erinevate parameetritega, põhjustab see kompileerimisvea.

Mis puudutab ülekirjutamist, siis Go kasutab liideseid: kui tüüp rakendab liidese meetodeid, siis liidese kaudu kutsumisel kutsutakse konkreetse tüübi meetod.

Seega toimub meetodi valik kompileerimise ajal funktsiooni nime ja signatuuri põhjal ning dünaamiline kutse liidese kaudu määratakse objekti tüübi järgi jooksvalt.

Näide:

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() // Trükib Woof
    s = Cat{}
    s.Speak() // Trükib Meow
}