Middle+
Porovnejte implementaci objektově orientovaného programování v Go a C#.
sobes.tech AI
Odpověď od AI
V jazyce Go neexistuje klasické objektově orientované dědění a třídy v tradičním smyslu. Místo toho Go používá kompozici a rozhraní.
Hlavní rozdíly:
- Třídy a objekty: C# je založen na třídách, ze kterých jsou vytvářeny objekty. Go používá struktury (structs), které mohou mít metody.
- Dědičnost: C# podporuje jednoduchou i vícenásobnou (přes rozhraní) dědičnost. Go podporuje kompozici (vnoření struktur) a polymorfismus přes rozhraní.
- Rozhraní: V C# musí být rozhraní explicitně implementováno třídou. V Go jsou rozhraní implementována implicitně: pokud struktura má metody odpovídající signatuře rozhraní, automaticky jej implementuje.
- Viditelnost (Access Modifiers): V C# se používají
public,private,protected,internal. Ve Go je viditelnost určena velikostí první písmena názvu: velké písmeno - veřejné, malé písmeno - soukromé (v rámci balíčku). - Generika: C# má rozvinutý systém generik. Go přidal podporu generik od verze 1.18.
Příklad kompozice v Go:
package main
import "fmt"
type Engine struct {
Type string
}
func (e Engine) Start() {
fmt.Printf("%s motor nastartoval!\n", e.Type)
}
type Car struct {
Model string
Engine // anonymní vnoření - kompozice
}
func main() {
myCar := Car{
Model: "Sedan",
Engine: Engine{
Type: "Benzín",
},
}
fmt.Printf("Model auta: %s\n", myCar.Model)
myCar.Start() // volání metody vnořené struktury
}
Příklad implementace rozhraní v Go:
package main
import "fmt"
type Speaker interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string {
return "Vau!"
}
type Cat struct{}
func (c Cat) Speak() string {
return "Mňau!"
}
func main() {
animals := []Speaker{Dog{}, Cat{}} // slice typů implementujících rozhraní Speaker
for _, animal := range animals {
fmt.Println(animal.Speak())
}
}
V tabulce:
| Vlastnost | Go | C# |
|---|---|---|
| Třídy | Ne (existují struktury) | Ano |
| Objekty | Instance struktur | Instance tříd |
| Dědičnost | Kompozice, rozhraní | Klasická (jednoduchá), rozhraní |
| Rozhraní | Implicitní implementace | Explicitní implementace |
| Viditelnost | Velikost prvního písmena | public, private, protected, atd. |
| Generika | Od verze 1.18 podporováno | Ano |
Go přístup k OOP je více decentralizovaný a zaměřený na chování (přes rozhraní) a datové struktury (přes vnoření), což často vede k flexibilnějšímu a lépe testovatelnému kódu. C# se drží tradičnějšího a hierarchičtějšího modelu.