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