Middle+
Dlaczego wstawianie w języku Go nie jest dziedziczeniem?
sobes.tech AI
Odpowiedź od AI
Wbudowywanie (embedding) w Go pozwala jednej strukturze korzystać z pól i metod innej struktury, jakby były jej własnymi.
Kluczowe różnice w stosunku do dziedziczenia:
- Kompozycja vs. Hierarchia: Wbudowywanie to forma kompozycji ("ma"), gdzie jedna struktura posiada inną. Dziedziczenie (w klasycznym OOP) to forma hierarchii ("jest"), gdzie jedna klasa jest podklasą innej.
- Polimorfizm: Go nie obsługuje polimorfizmu podtypów w tradycyjnym sensie dziedziczenia. Polimorfizm w Go realizowany jest przez interfejsy.
- Dostęp: Wbudowywanie sprawia, że pola i widoczne metody wbudowanej struktury są dostępne bezpośrednio przez strukturę zewnętrzną, ale nie tworzy hierarchii typów.
- Brak nadpisywania: Nie ma mechanizmu bezpośredniego "nadpisywania" metod klasy bazowej. Można zdefiniować metodę o tej samej nazwie w strukturze zewnętrznej, która "przyciemni" metodę wbudowaną.
Przykład wbudowywania:
package main
import "fmt"
type Engine struct {
Cylinders int
}
func (e Engine) Start() {
fmt.Println("Silnik uruchomiony z", e.Cylinders, " cylindrami")
}
type Car struct {
Engine // Wbudowanie Engine
Brand string
}
func main() {
myCar := Car{
Engine: Engine{Cylinders: 4},
Brand: "Toyota",
}
myCar.Start() // Dostęp do metody Start Engine przez Car
fmt.Println("Marka samochodu:", myCar.Brand)
fmt.Println("Cylindry silnika:", myCar.Cylinders) // Dostęp do pola Cylinders Engine przez Car
}
W tym przykładzie, Car posiada Engine, ale Car nie jest podtypem Engine. Po prostu uzyskujemy wygodny dostęp do pól i metod Engine przez strukturę Car.