Sobes.tech
Middle+

Porównaj implementację programowania obiektowego w Go i C#.

sobes.tech AI

Odpowiedź od AI

W Go nie ma klasycznego dziedziczenia obiektowego ani klas w tradycyjnym rozumieniu. Zamiast tego, Go używa kompozycji i interfejsów.

Główne różnice:

  • Klasy i obiekty: C# opiera się na klasach, z których tworzone są obiekty. Go używa struktur (structs), które mogą mieć metody.
  • Dziedziczenie: C# obsługuje dziedziczenie pojedyncze i wielokrotne (przez interfejsy). Go obsługuje kompozycję (wbudowywanie struktur) i polimorfizm przez interfejsy.
  • Interfejsy: W C# interfejsy muszą być jawnie implementowane przez klasę. W Go, interfejsy są implementowane niejawnie: jeśli struktura ma metody odpowiadające sygnaturze interfejsu, automatycznie go implementuje.
  • Widoczność (Modyfikatory dostępu): W C# używa się public, private, protected, internal. W Go widoczność określa pierwsza litera nazwy: wielka litera - publiczna, mała - prywatna (w ramach pakietu).
  • Generics: C# ma zaawansowany system generyków. Go dodał obsługę generyków od wersji 1.18.

Przykład kompozycji w Go:

package main

import "fmt"

type Engine struct {
	Type string
}

func (e Engine) Start() {
	fmt.Printf("%s engine started!\n", e.Type)
}

type Car struct {
	Model string
	Engine // Anonimowe wbudowanie - kompozycja
}

func main() {
	myCar := Car{
		Model: "Sedan",
		Engine: Engine{
			Type: "Petrol",
		},
	}
	fmt.Printf("Model samochodu: %s\n", myCar.Model)
	myCar.Start() // Wywołanie metody wbudowanej struktury
}

Przykład implementacji interfejsu w Go:

package main

import "fmt"

type Speaker interface {
	Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
	return "Woof!"
}

type Cat struct{}

func (c Cat) Speak() string {
	return "Meow!"
}

func main() {
	animals := []Speaker{Dog{}, Cat{}} // Lista typów implementujących interfejs Speaker
	for _, animal := range animals {
		fmt.Println(animal.Speak())
	}
}

W tabeli:

Cecha Go C#
Klasy Brak (struktury) Tak
Obiekty Instancje struktur Instancje klas
Dziedziczenie Kompozycja, interfejsy Klasyczne (pojedyncze), interfejsy
Interfejsy Implementacja niejawna Implementacja jawna
Widoczność Pierwsza litera wielka public, private, protected, itp.
Generics Od wersji 1.18 Tak

Podejście Go do OOP jest bardziej zdecentralizowane i skupia się na zachowaniu (poprzez interfejsy) i strukturze danych (poprzez wbudowywanie), co często prowadzi do bardziej elastycznego i łatwego do testowania kodu. C# trzyma się bardziej tradycyjnego i hierarchicznego modelu.