Sobes.tech
Middle

Mürəkkəb siniflər barədə danışarkən protokollar və siniflər arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Protokol müqaviləni müəyyən edir: bu, bu protokola uyğun olan bir növün həyata keçirməli olduğu tələblər (yöntemlər, xüsusiyyətlər, başlanğıcçılar) toplusudur. Protokolların əksər tələblərinin həyata keçirilməsi yoxdur. Protokolun nümunəsini yaratmaq mümkün deyil.

Swift-dən başqa dillərdə (məsələn, Java) abstrakt sinif, birbaşa nümunəsi yaradıla bilməyən sinfi ifadə edir. O, həm həyata keçirilmiş metodlar (və ya xüsusiyyətlər), həm də onun alt siniflərində həyata keçirilməli olan abstrakt metodlar ehtiva edir.

Swift-də, ənənəvi mənada, abstrakt sinif anlayışı yoxdur. Swift-də abstrakt siniflərin funksionallığı protokollar və sinflərin birləşməsi ilə əldə edilir.

Bir protokol istifadə edərək, interfeys müəyyən edilə bilər və sonra bu protokola uyğun və həyata keçirən adi sinif yaradıla bilər. Protokolün qismən həyata keçirilməsi genişlənmələr (protocol extensions) vasitəsilə təmin edilə bilər, lakin bu, protokolu saf formada "abstrakt sinif" etmir.

Protokol (Swift) Ənənəvi abstrakt sinif
Məqsəd Müqavilənin (interfeys) müəyyən edilməsi Ümumi davranış və strukturu müəyyən etmək, qismən həyata keçirmə ilə
Həyata keçirmə Ümumiyyətlə, həyata keçirmə ehtiva etmir (kənar genişlənmələr istisna olmaqla) Həm həyata keçirilmiş, həm də abstrakt metodlar ehtiva edə bilər
Nümunə yaratma Protokolun nümunəsini yaratmaq mümkün deyil Birbaşa abstrakt sinfin nümunəsini yaratmaq mümkün deyil
Miras Protokola uyğunluq (conformance) Miras (inheritance)
Çoxlu miras Növ, bir neçə protokola uyğunlaşa bilər Sinif yalnız bir sinifdən miras ala bilər (əksər dillərdə)
Swift-də Əsas abstraksiya formasıdır Birbaşa ekvivalent yoxdur, protokollar və siniflər ilə təqlid edilir

Swift-də abstrakt sinfi protokol və sinif vasitəsilə təqlid etmək nümunəsi:

Abstrakt tələbləri müəyyən edən protokol:

// Müqavilə kimi protokol
protocol Drawable {
    func draw()
    var color: String { get set }
}

Protokola uyğun və həyata keçirən sinif:

// Protokolu həyata keçirən sinif
class Circle: Drawable {
    var color: String

    init(color: String) {
        self.color = color
    }

    func draw() {
        print("Rəng \(color) olan dairə çəkilir")
    }
}

Varsayılan qismən həyata keçirmə təmin etmək üçün genişlənmə:

// Varsayılan qismən həyata keçirmə təmin edən genişlənmə (protokolu abstrakt sinif etmir)
extension Drawable {
    func draw() {
        print("Bir şey çəkməyə başlayırıq, rəng \(color)")
    }
}

Bu şəkildə, Swift-də protokollar çox formallıq və abstraksiya əldə etməkdə əsas rol oynayır və digər dillərdəki abstrakt sinf anlayışını əvəz edir.