Ի՞նչ է սովորական և աբստրակտ դասի նմանությունը և տարբերությունը։
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 ինտերֆեյսը։