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