Sobes.tech
Junior

Aký je rozdiel a podobnosť medzi bežnou a abstraktnou triedou?

sobes.tech AI

Odpoveď od AI

V Golangu neexistuje pojem "obyčajný trieda" a "abstraktná trieda" v tom zmysle, ako existujú v objektovo orientovaných jazykoch ako Java alebo C#.

Avšak, ich funkčnosť je možné napodobniť pomocou štruktúr a rozhraní.

Podobnosti (použitím štruktúr a rozhraní v Golangu):

  • Stav (údaje): Štruktúra môže obsahovať polia, podobne ako bežná trieda, ktorá uchováva vlastnosti.
  • Správanie (metódy): Štruktúre je možné pripojiť metódy, ktoré určujú jej správanie, podobne ako metódy bežnej triedy.
  • Všeobecná zmluva (pre abstraktnú triedu a rozhranie): Rozhranie v Golangu definuje súbor metód, ktoré musí implementovať akákoľvek štruktúra, "implementujúca" toto rozhranie. To je podobné tomu, ako abstraktná trieda alebo rozhranie v iných jazykoch stanovuje zmluvu pre potomkov alebo implementujúce triedy.

Rozdiely (v kontexte Golangu):

Prvok "Obyčajná trieda" (štruktúra s metódami) "Abstraktná trieda" (rozhranie + štruktúry)
Priame vytvorenie Môžete vytvoriť inštanciu štruktúry. Nie je možné vytvoriť inštanciu rozhrania.
Implementácia metód Všetky metódy, ktoré sú pripojené ku štruktúre, majú implementáciu. Rozhranie iba deklaruje metódy, ale ich implementáciu nie.
Dedičstvo Nie je v tradičnom zmysle, môžete použiť kompozíciu (vloženie štruktúr). Rozhranie sa nezdedí, ale implementujú ho štruktúry.
Povinnosť implementácie Nie je nútené implementovať určitú sadu metód okrem tých, ktoré sú pripojené ku štruktúre. Akákoľvek štruktúra, ktorá "implementuje" rozhranie v Golang, musí poskytnúť implementáciu všetkých jeho metód.
Ukladanie stavu (polí) Štruktúra môže obsahovať dátové polia. Rozhranie neobsahuje dátové polia.

Príklad za imitatívne použitie:

// rozhranie, ktoré napodobňuje abstraktný triedu
type Shape interface {
	Area() float64
	Perimeter() float64
}

// štruktúra, ktorá napodobňuje obyčajnú triedu
type Circle struct {
	Radius float64
}

// implementácia metód rozhrania pre Circle
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

func (c Circle) Perimeter() float64 {
	return 2 * 3.14 * c.Radius
}

// Ďalšia štruktúra, ktorá implementuje rozhranie
type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}

func (r Rectangle) Perimeter() float64 {
	return 2 * (r.Width + r.Height)
}

V tomto príklade Shape slúži ako zmluva (podobne ako abstraktný tried alebo rozhranie v iných jazykoch), zatiaľ čo Circle a Rectangle sú ako konkrétne realizácie (podobne ako obyčajné triedy). Môžeme vytvárať inštancie Circle a Rectangle, ale nemôžeme priamo vytvoriť inštanciu Shape. Obidve štruktúry musia implementovať metódy Area() a Perimeter(), aby "realizovali" rozhranie Shape.