Sobes.tech
Junior

Ի՞նչ է սովորական և աբստրակտ դասի նմանությունը և տարբերությունը։

sobes.tech AI

Պատասխան AI-ից

Գոլանգում չկա հասկացություն, ինչպիսիք են «հարցային դասը» և «աբստրակտ դասը» այն ձևով, ինչպես դրանք գոյություն ունեն օբյեկտային-կողմնորոշված լեզուներում, ինչպիսիք են Java կամ C#:

Այնուամենայնիվ, նրանց գործառույթը կարելի է իմիտացնել կառուցվածքների և ինտերֆեյսների օգտագործմամբ:

Համապատասխանություն (օգտագործելով կառուցվածքներ և ինտերֆեյսներ Golang-ում):

  • Կարգավիճակ (տվյալներ): Կառուցվածքը կարող է պարունակել դաշտեր, ինչպես սովորական դասը, որը պահում է հատկություններ:
  • Կեցություն (մեթոդներ): Կառուցվածքին կարող են կցվել մեթոդներ, որոնք կորոշեն նրա վարքագիծը, ինչպես սովորական դասի մեթոդները:
  • Ընդհանուր պայմանագիր (աբստրակտ դասի և ինտերֆեյսի համար): Golang-ի ինտերֆեյսը սահմանում է մեթոդների հավաքածու, որը պետք է իրականացնել ցանկացած կառուցվածք, որը «իրականացնում է» այդ ինտերֆեյսը: Սա նման է այն բանի, ինչպես է աբստրակտ դասը կամ ինտերֆեյսը մյուս լեզուներում սահմանում պայմանագիր ժառանգների կամ իրականացնելիս դասերի համար:

Տարբերություններ (Golang-ի համատեքստում):

Գծանշում «Հարցային դաս» (մեթոդներով կառուցվածք) «Աբստրակտ դաս» (ինտերֆեյս + կառուցվածքներ)
Նպատակի ստեղծում Կարող եք ստեղծել կառուցվածքի օրինակ։ Չի կարելի ստեղծել ինտերֆեյսի օրինակ։
Մեթոդների իրականացում Բոլոր մեթոդները, որոնք կցված են կառուցվածքին, ունեն իրականացում։ Ինտերֆեյսը միայն հայտարարում է մեթոդները, բայց ոչ նրանց իրականացումը։
Նշանակում Չկա ավանդական ժառանգություն։ Կարող եք օգտագործել կոմպոզիցիա (ստրուկտուրների ներդնում): Ինտերֆեյսը ժառանգվում է, բայց իրականացնում են կառուցվածքները։
Պարտավորություն իրականացնել Չի պարտադրվում իրականացնել որոշակի մեթոդների հավաքածու, բացի այն, որոնք կցված են կառուցվածքին։ Յուրաքանչյուր կառուցվածք, որը «իրականացնում է» Golang-ի ինտերֆեյսը, պետք է տրամադրի նրա բոլոր մեթոդների իրականացումը։
Կարգավիճակի պահպանում (դաշտեր) Կառուցվածքը կարող է պարունակել տվյալների դաշտեր։ Ինտերֆեյսը չի պարունակում տվյալների դաշտեր։

Օրինակ՝ իմիտացիայի համար:

// ինտերֆեյս, որը իմիտացիա է աբստրակտ դասի
type Shape interface {
	Area() float64
	Perimeter() float64
}

// կառուցվածք, որը իմիտացիա է սովորական դասի
type Circle struct {
	Radius float64
}

// ինտերֆեյսի մեթոդների իրականացում Circle-ի համար
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

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

// Այլ կառուցվածք, որը իրականացնում է ինտերֆեյսը
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)
}

Այս օրինակով Shape-ը որպես պայմանագիր է (նման աբստրակտ դաս կամ ինտերֆեյս այլ լեզուներում), իսկ Circle և Rectangle՝ որպես կոնկրետ իրականացումներ (նման սովորական դասերի): Մենք կարող ենք ստեղծել Circle և Rectangle օրինակներ, բայց ոչ կարող ենք անմիջապես ստեղծել Shape օրինակ։ Երկու կառուցվածքները պարտավոր են իրականացնել Area() և Perimeter() մեթոդները, որպեսզի «իրականացնեն» Shape ինտերֆեյսը։