- Published on
Swiftda Inheritance
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Bilimingizni sinab ko'ring!
20 ta savol Β· ~20 daqiqa
Boshqa OOP tillariga o'xshab, Swift ham class inheritance (meros olish) kontseptsiyasini qo'llab-quvvatlaydi.
Inheritance mavjud classdan yangi class yaratish imkonini beradi.
Yaratilgan yangi class subclass (child yoki derived class) deb ataladi va yangi class qaysi classdan olingan bo'lsa, u superclass (parent yoki base class) deb ataladi.
Inheritance sintaksisi
Swiftda bir classdan boshqa classni meros olish uchun ikki nuqta : belgisidan foydalanamiz. Masalan,
// superclass e'lon qilish
class Animal {
// propertylar va metodlarni e'lon qilish
}
// inheritance
class Dog: Animal {
// Animal classining propertylar va metodlari
// Dog classining propertylar va metodlari
}
Bu yerda Dog subclassini Animal superclassidan meros oldik.
Misol:
Yuqoridagi misolda Animal superclassidan Dog subclassini meros oldik. Quyidagi qatorlarga e'tibor bering:
labrador.name = "Rohu"
labrador.eat()
Bu yerda Animal classining name va eat() ga murojaat qilish uchun labrador (Dog obyekti)dan foydalanamiz. Bu mumkin, chunki subclass superclassning barcha property va metodlarini meros oladi.
Shuningdek, biz Dog classining metodi ichidan name propertyga murojaat qildik.
is-a munosabat
Swiftda inheritance is-a (hisoblanadi) munosabatidir. Ya'ni, biz inheritancedan faqat ikki class o'rtasida is-a munosabati mavjud bo'lsa foydalanamiz. Masalan,
- Car is a Vehicle (Mashina β transport vositasi)
- Apple is a Fruit (Olma β meva)
- Cat is an Animal (Mushuk β hayvon)
Bu yerda Car classini Vehicle classidan, Apple classini Fruit classidan meros olish mumkin va hokazo.
Inheritanceda method overriding
Oldingi misolda subclass obyekti superclassning metodiga murojaat qilishi mumkinligini ko'rdik.
Ammo agar bir xil metod superclass va subclassda mavjud bo'lsa-chi?
Bunday holatda subclassdagi metod superclassdagi metodning ustidan yoziladi. Bu konseptsiya Swiftda method overriding deb ataladi.
Biz kompilyatorga metodning ustidan yozilayotganini bildirish uchun override kalit so'zidan foydalanamiz.
Misol:
Yuqoridagi misolda bir xil eat() metodi Dog classida ham, Animal classida ham mavjud.
Endi Dog subclass obyekti yordamida eat() metodini chaqirganimizda, Dog classining metodi chaqiriladi.
Buning sababi, Dog subclassining eat() metodi Animal superclassining bir xil metodining ustidan yoziladi. Biz metod ustidan yozilishini bildirish uchun override kalit so'zidan foydalandik.
override func eat() {
print("Men it ovqatini yeyman")
}
Inheritanceda super kalit so'zi
Avval ko'rganimizdek, subclassdagi bir xil metod superclassdagi metodning ustidan yoziladi.
Ammo agar subclassdan superclass metodiga murojaat qilishimiz kerak bo'lsa, super kalit so'zidan foydalanamiz. Masalan,
Yuqoridagi misolda Dog subclassining eat() metodi Animal superclassining bir xil metodining ustidan yoziladi.
Dog classi ichida
// superclass metodini chaqirish
super.eat()
dan foydalanib, Dog subclassidan Animal superclassining eat() metodini chaqirdik.
Shunday qilib, labrador obyekti yordamida eat() metodini chaqirganimizda
// eat() metodini chaqirish
labrador.eat()
Ham ustidan yozilgan, ham superclass versiyasidagi eat() metodi bajariladi.
Nima uchun Inheritance?
Inheritancening afzalliklarini tushunish uchun bir vaziyatni ko'rib chiqaylik.
Faraz qilaylik, biz muntazam ko'pburchaklar (kvadrat, beshburchak va hokazo) bilan ishlayapmiz. Va kiritilgan ma'lumotlarga asoslanib bu ko'pburchaklarning perimetrini topishimiz kerak.
- Barcha muntazam ko'pburchaklar uchun perimetrni hisoblash formulasi umumiy bo'lgani uchun, biz
Polygonclassi va perimetrni hisoblash uchuncalculatePerimeter()metodini yaratishimiz mumkin.
class RegularPolygon {
calculatePerimeter() {
// perimetrni hisoblash kodi
}
}
- Va
SquarevaPentagonclasslariniRegularPolygonclassidan meros olamiz. Bu classlarning har biri uzunlik va tomonlar sonini saqlash uchun propertyga ega bo'ladi, chunki ular barcha ko'pburchaklar uchun har xil.
class Square: RegularPolygon {
var length = 0 // uzunlik
var sides = 0 // tomonlar soni
}
Perimetrni hisoblash uchun calculatePerimeter() ga length va sides qiymatlarini uzatamiz.
Mana shunday qilib, inheritance kodimizni qayta ishlatish imkonini beradi va intuitiv qiladi.
Misol:
Yuqoridagi misolda muntazam ko'pburchakning perimetrini hisoblaydigan RegularPolygon classi yaratdik.
Bu yerda RegularSquare va RegularTriangle classlar RegularPolygon classidan meros oladi.
Muntazam ko'pburchakning perimetrini hisoblash formulasi barchasi uchun umumiy bo'lgani uchun, biz superclassning calculatePerimeter() metodini qayta ishlatdik.
Va yuzani hisoblash formulasi har xil shakllar uchun har xil bo'lgani uchun, yuzani hisoblash uchun subclass ichida alohida metod yaratdik.