Sobes.tech
Middle+

Γιατί η ενσωμάτωση στη γλώσσα Go δεν είναι κληρονομιά;

sobes.tech AI

Απάντηση από AI

Το ενσωμάτωση (embedding) στο Go επιτρέπει σε μια δομή να χρησιμοποιεί πεδία και μεθόδους μιας άλλης δομής σαν να ήταν δικά της.

Βασικές διαφορές με την κληρονομικότητα:

  • Σύνθεση vs. Ιεραρχία: Το embedding είναι μια μορφή σύνθεσης ("έχει ένα"), όπου μια δομή έχει μια άλλη. Η κληρονομικότητα (στο κλασικό αντικειμενοστραφές προγραμματισμό) είναι μια μορφή ιεραρχίας ("είναι ένα"), όπου μια κλάση είναι μια υποκλάση μιας άλλης.
  • Πολυμορφισμός: Το Go δεν υποστηρίζει πολυμορφισμό υποτύπων με την παραδοσιακή έννοια της κληρονομικότητας. Ο πολυμορφισμός στο Go υλοποιείται μέσω διεπαφών.
  • Πρόσβαση: Το embedding καθιστά άμεσα προσβάσιμα τα ορατά πεδία και μεθόδους της ενσωματωμένης δομής μέσω της εξωτερικής δομής, αλλά δεν δημιουργεί μια ιεραρχία τύπων.
  • Χωρίς υπερισχύσεις: Δεν υπάρχει άμεσος μηχανισμός "υπερισχύσεων" των μεθόδων της βασικής κλάσης. Μπορείς να ορίσεις μια μέθοδο με το ίδιο όνομα στην εξωτερική δομή, η οποία "κρύβει" τη ενσωματωμένη μέθοδο.

Παράδειγμα ενσωμάτωσης:

package main

import "fmt"

type Engine struct {
	Cylinders int
}

func (e Engine) Start() {
	fmt.Println("Ο κινητήρας ξεκίνησε με", e.Cylinders, "κυλίνδρους")
}

type Car struct {
	Engine // Ενσωμάτωση του Engine
	Brand  string
}

func main() {
	myCar := Car{
		Engine: Engine{Cylinders: 4},
		Brand:  "Toyota",
	}
	myCar.Start() // Πρόσβαση στη μέθοδο Start του Engine μέσω του Car
	fmt.Println("Μάρκα αυτοκινήτου:", myCar.Brand)
	fmt.Println("Κυλίνδρους κινητήρα:", myCar.Cylinders) // Πρόσβαση στο πεδίο Cylinders του Engine μέσω του Car
}

Σε αυτό το παράδειγμα, το Car έχει έναν Engine, αλλά το Car δεν είναι υποκλάση του Engine. Απλώς αποκτούμε εύκολη πρόσβαση στα πεδία και τις μεθόδους του Engine μέσω της δομής Car.