Sobes.tech
Middle

Abstrakt sinflar haqida gap ketganda protokollar va sinflar o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

Protokol shartnoma aniqlaydi: bu protokolga mos keladigan tur tomonidan bajarilishi kerak bo'lgan talablar (usullari, xususiyatlari, boshlovchilari) to'plamidir. Protokollar ko'p talablarining amalga oshirilishini o'z ichiga olmaydi. Protokolning nusxasini yaratish mumkin emas.

Swiftdan boshqa tillarda (masalan, Java) abstrakt sinf to'g'ridan-to'g'ri nusxa ko'chirish mumkin bo'lmagan sinfni anglatadi. U amalga oshirilgan usullar (yoki xususiyatlar) bilan birga, uning vorislari tomonidan amalga oshirilishi kerak bo'lgan abstrakt usullarni ham o'z ichiga oladi.

Swiftda, an'anaviy ma'noda, abstrakt sinf tushunchasi mavjud emas. Swiftda abstrakt sinflarning funksionalligi protokollar va sinflar kombinatsiyasi orqali amalga oshiriladi.

Protokoldan foydalanib, interfeysni aniqlash mumkin, so'ngra bu protokolga mos keladigan va amalga oshirishni ta'minlaydigan oddiy sinf yaratish mumkin. Protokolning qisman amalga oshirilishi kengaytmalar (protocol extensions) yordamida taqdim etilishi mumkin, ammo bu protokolni toza shaklda "abstrakt sinf" qilmaydi.

Protokol (Swift) An'anaviy abstrakt sinf
Maqsad Shartnoma (interfeys) aniqlash Umumiy xatti-harakat va tuzilmani aniqlash, qisman amalga oshirish bilan
Amalga oshirish Odatda, amalga oshirilmaydi (kengaytmalar bundan mustasno) Amalga oshirilgan va abstrakt usullarni o'z ichiga olishi mumkin
Nusxa ko'chirish Protokol nusxasini yaratish mumkin emas To'g'ridan-to'g'ri abstrakt sinf nusxasini yaratish mumkin emas
Merosi Protokolga mos kelish (conformance) Meros (inheritance)
Ko'p meros Tur bir nechta protokolga mos kelishi mumkin Sinf faqat bitta sinfdan meros olishi mumkin (ko'pchilik tillarda)
Swiftda Asosiy abstraktsiya shaklidir To'g'ridan-to'g'ri ekvivalent mavjud emas, protokollar va sinflar bilan taqlid qilinadi

Swiftda abstrakt sinfni taqlid qilish uchun misol:

Abstrakt talablarni aniqlovchi protokol:

// Shartnoma sifatida protokol
protocol Drawable {
    func draw()
    var color: String { get set }
}

Protokolga mos keladigan va amalga oshiradigan sinf:

// Protokolni amalga oshiradigan sinf
class Circle: Drawable {
    var color: String

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

    func draw() {
        print("Rang \(color) bo'lgan doira chizilmoqda")
    }
}

Standart qisman amalga oshirishni taqdim etish uchun kengaytma:

// Standart qisman amalga oshirishni taqdim etish uchun kengaytma (protokolni abstrakt sinf qilmaydi)
extension Drawable {
    func draw() {
        print("Biror narsa chizishni boshlaymiz, rang \(color)")
    }
}

Shu tarzda, Swiftda protokollar polimorfizm va abstraktsiyani amalga oshirishda asosiy rol o'ynaydi va boshqa tillardagi abstrakt sinf tushunchasini almashtiradi.