Ի՞նչ տարբերություն կա պրոտոկոլների և դասերի միջև, երբ խոսքը գնում է աբստրակտ դասերի մասին։
sobes.tech AI
Պատասխան AI-ից
Պրոտոկոլը սահմանում է պայման — պահանջների հավաքածու (մեթոդներ, հատկություններ, ինիցիալիզատորներ), որոնք պետք է իրականացնել այն տիպը, որը համապատասխանում է այս պրոտոկոլին։ Պրոտոկոլները չունեն իրենց պահանջների մեծ մասի իրականացում։ Պրոտոկոլից օրինակներ ստեղծել հնարավոր չէ։
Աբստրակտ դասը այն լեզուներում, որոնք տարբերվում են Swift-ից (օրինակ՝ Java), ներկայացնում է դաս, որը հնարավոր չէ անմիջապես ինստանցացնել։ Այն պարունակում է ինչպես իրականացված մեթոդներ (կամ հատկություններ), այնպես էլ աբստրակտ մեթոդներ, որոնք պետք է իրականացվեն նրա ենթակլասներում։
Swift-ում չկա ավանդական իմաստով աբստրակտ դասերի հասկացողություն։ Աբստրակտ դասերի գործառույթը հասնում է պրոտոկոլների և դասերի համադրությամբ։
Օգտագործելով պրոտոկոլ, կարելի է սահմանել ինտերֆեյս, իսկ հետո ստեղծել սովորական դաս, որը համապատասխանում է այս պրոտոկոլին և տրամադրում է իրականացման։ Պրոտոկոլի մասնակի իրականացումը կարող է տրամադրվել ընդլայնումներով (protocol extensions), բայց դա չի դարձնում պրոտոկոլը "աբստրակտ դաս"։
| Պրոտոկոլ (Swift) | Աբստրակտ դաս (պարադիգմային) | |
|---|---|---|
| Նպատակը | Կոնտակտի սահմանում (ինտերֆեյս) | Ընդհանուր վարքագծի և կառուցվածքի սահմանում մասնակի իրականացմամբ |
| Իրականացում | Հաճախ չի պարունակում իրականացում (բացառությամբ ընդլայնումների) | Կարող է պարունակել ինչպես իրականացված, այնպես էլ աբստրակտ մեթոդներ |
| Նախագծում | Չի կարող ստեղծել օրինակ պրոտոկոլից | Չի կարող անմիջապես ստեղծել աբստրակտ դասի օրինակ |
| Երեսպատում | Համապատասխանություն պրոտոկոլին (conformance) | Երեսպատում (inheritance) |
| Բազմակի ժառանգություն | Տիպը կարող է համապատասխանել մի քանի պրոտոկոլների | Դասը կարող է ժառանգել միայն մեկ դասից (շատ լեզուներում) |
| Swift-ում | Հիմնական ձևը աբստրակցիայի | Չունի ուղիղ համարժեք, իմիտացիա է պրոտոկոլների և դասերի միջոցով |
Օրինակ՝ աբստրակտ դասի իմիտացիա պրոտոկոլ և դաս օգտագործելով Swift-ում:
Պրոտոկոլ, որը սահմանում է աբստրակտ պահանջները:
// Պրոտոկոլ, որպես պայման
protocol Drawable {
func draw()
var color: String { get set }
}
Դաս, որը համապատասխանում է պրոտոկոլին և տրամադրում է իրականացման:
// Դաս, որը իրականացնում է պրոտոկոլը
class Circle: Drawable {
var color: String
init(color: String) {
self.color = color
}
func draw() {
print("Անվանումը գծում է շրջան \(color)")
}
}
Ընդլայնում՝ կանխորոշված մասնակի իրականացման տրամադրման համար:
// Ընդլայնում՝ կանխորոշված իրականացման տրամադրման համար (չի դարձնում պրոտոկոլը աբստրակտ դաս)
extension Drawable {
func draw() {
print("Սկսում ենք ինչ-որ բան գծել \(color)")
}
}
Այսպիսով, Swift-ում պրոտոկոլները կարևոր դեր են խաղում պոլիմորֆիզմի և աբստրակցիայի հասնելու գործում, փոխարինելով այլ լեզուների աբստրակտ դասերի կոնցեպցիան։