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.