Junior
Kāda ir parastās un abstraktās klases līdzība un atšķirība?
sobes.tech AI
Atbilde no AI
Golang nav jēdziena kā "parasts klases" un "abstrakta klases" tādā formā, kādi tie pastāv objektorientētajās valodās, piemēram, Java vai C#.
Tomēr to funkcionalitāti var imitēt, izmantojot struktūras un saskarnes.
Līdzības (izmantojot struktūras un saskarnes Golang):
- Stāvoklis (dati): Struktūra var saturēt laukus, kā parasta klase, kas glabā īpašības.
- Uzvedība (metodes): Struktūrai var pievienot metodes, kas nosaka tās uzvedību, līdzīgi kā parastās klases metodes.
- Vispārīgs līgums (par abstraktu klasi un saskarni): Golang saskarne definē metožu kopumu, ko jebkura struktūra, "īstenojot" šo saskarni, ir jārealizē. Tas ir līdzīgi tam, kā abstrakta klase vai saskarne citās valodās nosaka līgumu mantoņiem vai īstenojošajām klasēm.
Atšķirības (Golang kontekstā):
| Raksturlielums | "Parasta klase" (struktūra ar metodēm) | "Abstrakta klase" (saskarne + struktūras) |
|---|---|---|
| Tieša izveide | Var izveidot struktūras eksemplāru. | Nav iespējams izveidot saskarnes eksemplāru. |
| Metodes realizācija | Visas metodes, kas pievienotas struktūrai, ir realizētas. | Saskarne tikai deklarē metodes, bet to realizāciju ne. |
| Mantošana | Nav tradicionālas mantošanas. Var izmantot kompozīciju (struktūru iekļaušanu). | Saskarne netiek mantojama, bet struktūras to īsteno. |
| Nepieciešamība realizēt | Nav obligāti realizēt noteiktu metožu kopumu, izņemot tās, kas pievienotas struktūrai. | Katru struktūru, kas "īsteno" Golang saskarni, ir jānodrošina visu tās metožu realizācija. |
| Stāvokļa glabāšana (lauki) | Struktūra var saturēt datu laukus. | Saskarne neietver datu laukus. |
Piemērs imitācijai:
// saskarne, kas imitē abstraktu klasi
type Shape interface {
Area() float64
Perimeter() float64
}
// struktūra, kas imitē parastu klasi
type Circle struct {
Radius float64
}
// saskarnes metožu realizācija Circle
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
// Vēl viena struktūra, kas īsteno saskarni
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)
}
Šajā piemērā Shape darbojas kā līgums (līdzīgi kā abstrakta klase vai saskarne citās valodās), bet Circle un Rectangle ir kā konkrētas īstenojumi (līdzīgi kā parastas klases). Mēs varam izveidot Circle un Rectangle eksemplārus, bet nevaram tieši izveidot Shape eksemplāru. Abi struktūras ir jārealizē Area() un Perimeter() metodes, lai "īstenotu" Shape saskarni.