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