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.