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.