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
}