Sobes.tech
Middle

Ի՞նչ տարբերություն կա պրոտոկոլների և դասերի միջև, երբ խոսքը գնում է աբստրակտ դասերի մասին։

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-ում պրոտոկոլները կարևոր դեր են խաղում պոլիմորֆիզմի և աբստրակցիայի հասնելու գործում, փոխարինելով այլ լեզուների աբստրակտ դասերի կոնցեպցիան։