Junior — Middle
Как определя компилаторът коя конкретна метод трябва да бъде извикана при претоварване или презаписване?
sobes.tech AI
Отговор от AI
В Go няма пренатоварване на методи в класическия смисъл, като в C++ или Java. Всеки метод или функция има уникално име в пакета. Ако има няколко функции с едно и също име, но различни параметри, това ще доведе до грешка при компилация.
Що се отнася до презаписването, Go използва интерфейси: ако тип реализира методите на интерфейс, при извикване чрез интерфейс ще бъде извикан методът на конкретния тип.
Така, изборът на метод става по време на компилация въз основа на името и сигнатурата на функцията, а динамичното извикване чрез интерфейс се определя по типа на обекта по време на изпълнение.
Пример:
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() // Ще изведе Woof
s = Cat{}
s.Speak() // Ще изведе Meow
}