Junior
Adi və abstrakt sinifin oxşarlığı və fərqi nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Golang-da, obyekt-yönümlü dillərdə Java və ya C# kimi, "adi sinf" və "abstrakt sinf" anlayışları mövcud deyil.
Ancaq, onların funksionallığı strukturlar və interfeyslər istifadə edilərək təqlid oluna bilər.
Oxşarlıqlar (Golang-də strukturlar və interfeyslər istifadə edilərək):
- Vəziyyət (məlumatlar): Struktur, adi sinfin xüsusiyyətlərini saxlayan sahələrə malik ola bilər.
- Davranış (metodlar): Strukturun üzərinə metodlar əlavə oluna bilər, bu onun davranışını müəyyən edir, eləcə də adi sinfin metodlarına bənzər.
- Ümumi müqavilə (abstrakt sinf və interfeys üçün): Golang-də interfeys, bu interfeysi "icra edən" hər hansı strukturun həyata keçirməli olduğu metodlar toplusunu müəyyən edir. Bu, digər dillərdəki abstrakt sinf və ya interfeysin, irsi və ya həyata keçirən sinflər üçün müqavilə müəyyən etməsinə bənzəyir.
Fərqlər (Golang kontekstində):
| Xüsusiyyət | "Adi sinf" (metodlar ilə struktur) | "Abstrakt sinf" (interfeys + struktur) |
|---|---|---|
| Birbaşa yaradılması | Struktur nümunəsi yaradıla bilər. | Interfeys nümunəsi yaradıla bilməz. |
| Metodların həyata keçirilməsi | Strukturun bütün metodları həyata keçirilməlidir. | Interfeys yalnız metodları elan edir, onların həyata keçirilməsini deyil. |
| Miras | Klassik mənada miras yoxdur. Kompozisiya (strukturların daxil edilməsi) istifadə edilə bilər. | Interfeys miras almır, amma struktur tərəfindən həyata keçirilir. |
| Təhlükəsizlik (tələblər) | Müəyyən metodların həyata keçirilməsi məcburi deyil, strukturə əlavə olunanlar xaricində. | Hər hansı struktur, Golang interfeysini "icra etdikdə", onun bütün metodlarını təmin etməlidir. |
| Vəziyyətin saxlanması (sahələr) | Struktur məlumat sahələrini içərə bilər. | Interfeys məlumat sahələrini ehtiva etmir. |
İmitasiya nümunəsi:
// abstrakt sinfi təqlid edən interfeys
type Shape interface {
Area() float64
Perimeter() float64
}
// adi sinfi təqlid edən struktur
type Circle struct {
Radius float64
}
// Circle üçün interfeys metodlarının həyata keçirilməsi
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
// Interfeysi həyata keçirən başqa struktur
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)
}
Bu nümunədə, Shape müqavilə kimi çıxış edir (başqa dillərdəki abstrakt sinf və ya interfeys kimi), və Circle və Rectangle konkret həyata keçirmələrdir (adi sinflərə bənzər). Circle və Rectangle nümunələri yarada bilərik, amma birbaşa Shape nümunəsi yarada bilmərik. Həmçinin, hər iki struktur Area() və Perimeter() metodlarını həyata keçirməlidir ki, Shape interfeysini "yerinə yetirsin".