Junior — Middle
Jak kompilator określa, którą konkretną metodę wywołać przy przeciążeniu lub nadpisaniu?
sobes.tech AI
Odpowiedź od AI
W Go nie ma przeciążania metod w klasycznym sensie, jak w C++ czy Java. Każda metoda lub funkcja ma unikalną nazwę w pakiecie. Jeśli istnieje kilka funkcji o tej samej nazwie, ale różnych parametrach, spowoduje to błąd kompilacji.
Jeśli chodzi o nadpisywanie, Go używa interfejsów: jeśli typ implementuje metody interfejsu, to podczas wywołania przez interfejs zostanie wywołana metoda konkretnego typu.
W ten sposób wybór metody odbywa się podczas kompilacji na podstawie nazwy i sygnatury funkcji, a wywołanie dynamiczne przez interfejs jest określane na podstawie typu obiektu w czasie wykonywania.
Przykład:
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() // Wypisze Woof
s = Cat{}
s.Speak() // Wypisze Meow
}