Mi a hasonlóság és a különbség a normál és az absztrakt osztály között?
sobes.tech MI
Válasz az MI-től
A Golangban nincs olyan fogalom, mint a "szokásos osztály" és az "absztrakt osztály" olyan formában, ahogyan azok az objektum-orientált nyelvekben, például Java vagy C# nyelvben léteznek.
Azonban funkciójukat lehet utánozni struktúrák és interfészek használatával.
Hasonlóság (struktúrák és interfészek használatával Golangban):
- Állapot (adatok): Egy struktúra tartalmazhat mezőket, mint egy szokásos osztály, amelyek tulajdonságokat tárolnak.
- Viselkedés (metódusok): A struktúrához metódusokat lehet csatolni, amelyek meghatározzák annak viselkedését, hasonlóan a szokásos osztályokhoz.
- Általános szerződés (az absztrakt osztály és az interfész esetében): A Golang interfész meghatározza azokat a metódusokat, amelyeket bármely struktúra meg kell valósítson, "megvalósítva" ezt az interfészt. Ez hasonló ahhoz, ahogyan az absztrakt osztály vagy interfész más nyelvekben szerződést határoz meg az öröklődő vagy megvalósító osztályok számára.
Különbség (a Golang kontextusában):
| Jellemző | "Szokásos osztály" (metódusokkal ellátott struktúra) | "Abszttrakt osztály" (interfész + struktúrák) |
|---|---|---|
| Közvetlen példányosítás | Létrehozható egy struktúra példánya. | Nem hozható létre interfész példánya. |
| Metódusok megvalósítása | Minden metódus, amely a struktúrához van csatolva, megvalósítottnak tekinthető. | Az interfész csak deklarálja a metódusokat, de nem azok implementációját. |
| Öröklődés | Nincs hagyományos értelemben vett öröklődés. Kompozíciót (struktúrák beágyazása) lehet használni. | Az interfész nem öröklődik, hanem struktúrák valósítják meg. |
| Kötelező megvalósítás | Nincs kényszer a meghatározott metódusok megvalósítására, kivéve azokat, amelyek a struktúrához vannak csatolva. | Bármely struktúra, amely "megvalósítja" a Golang interfészt, biztosítania kell az összes metódusának megvalósítását. |
| Állapot (mezők) tárolása | A struktúra tartalmazhat adatmezőket. | Az interfész nem tartalmaz adatmezőket. |
Példa az utánozásra:
// interfész, amely az absztrakt osztályt imitálja
type Shape interface {
Area() float64
Perimeter() float64
}
// struktúra, amely egy szokásos osztályt imitál
type Circle struct {
Radius float64
}
// az interfész metódusainak megvalósítása Circle esetén
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
// Egy másik struktúra, amely megvalósítja az interfészt
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)
}
Ebben a példában a Shape szerződésként (azaz absztrakt osztály vagy interfész megfelelőjeként más nyelvekben), míg a Circle és Rectangle konkrét megvalósításokként (azaz szokásos osztályokként) működnek. Létrehozhatunk példányokat Circle és Rectangle típusokból, de nem hozhatunk létre közvetlenül Shape példányt. Mindkét struktúrának meg kell valósítania az Area() és Perimeter() metódusokat, hogy "megvalósítsa" a Shape interfészt.