Sobes.tech
Junior

Kokia yra įprastos ir abstrakčios klasės panašumas ir skirtumas?

sobes.tech AI

Atsakymas iš AI

Golang nėra sąvokos kaip "įprastas klasės" ir "abstrakti klasė" tokiu pavidalu, kaip jos egzistuoja objektų orientuotuose kalbose, pvz., Java ar C#.

Tačiau jų funkcionalumą galima imituoti naudojant struktūras ir sąsajas.

Panašumai (naudojant struktūras ir sąsajas Golang):

  • Būsena (duomenys): Struktūra gali turėti laukus, kaip įprasta klasė, sauganti savybes.
  • Elgsena (metodai): Struktūrai galima priskirti metodus, kurie apibrėžia jos elgseną, panašiai kaip įprastos klasės metodai.
  • Bendras sutartis (abstrakčios klasės ir sąsajos atveju): Golang sąsaja apibrėžia metodų rinkinį, kurį turi įgyvendinti bet kuri struktūra, "įgyvendinanti" šią sąsają. Tai panašu į tai, kaip abstrakti klasė ar sąsaja kitose kalbose nustato sutartį paveldėtojams ar įgyvendinantiems klasių.

Skirtumai (Golang kontekste):

Bruožas "Įprasta klasė" (metodais apibrėžta struktūra) "Abstrakti klasė" (sąsaja + struktūros)
Tiesioginis kūrimas Galima sukurti struktūros egzempliorių. Negalima sukurti sąsajos egzemplioriaus.
Metodų įgyvendinimas Visos metodai, priskirti struktūrai, turi įgyvendinimą. Sąsaja tik deklaruoja metodus, bet jų įgyvendinimo ne.
Paveldėjimas Nėra tradicinio paveldėjimo. Galima naudoti kompoziciją (struktūrų įterpimą). Sąsaja nėra paveldima, ją įgyvendina struktūros.
Įgyvendinimo privalomumas Nėra privaloma įgyvendinti tam tikrą metodų rinkinį, išskyrus tuos, kurie priskirti struktūrai. Bet kuri struktūra, "įgyvendinanti" Golang sąsają, turi pateikti visų jos metodų įgyvendinimą.
Būsena (laukeliai) Struktūra gali turėti duomenų laukus. Sąsaja neapima duomenų laukų.

Pavyzdys imitacijai:

// sąsaja, imituojanti abstraktų klasę
type Shape interface {
	Area() float64
	Perimeter() float64
}

// struktūra, imituojanti įprastą klasę
type Circle struct {
	Radius float64
}

// sąsajos metodų įgyvendinimas Circle
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

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

// Kita struktūra, įgyvendinanti sąsają
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)
}

Šiame pavyzdyje Shape veikia kaip sutartis (panašiai kaip abstrakti klasė ar sąsaja kitose kalbose), o Circle ir Rectangle – kaip konkrečios įgyvendinimai (panašiai kaip įprastos klasės). Galime kurti Circle ir Rectangle egzempliorius, bet negalime tiesiogiai sukurti Shape egzemplioriaus. Abi struktūros turi įgyvendinti Area() ir Perimeter() metodus, kad "įgyvendintų" Shape sąsają.