Kotlin'da meros va ko'p shakllilik qanday tashkil etilgan?
sobes.tech AI
AIdan javob
Kotlin'da meros mekanizmlari orqali sinflar va interfeyslar bilan amalga oshiriladi. Sinflar faqat bitta sinfdan meros olishi mumkin (birlamchi meros), ammo bir nechta interfeyslarni amalga oshirishi mumkin.
Standart holatda, Kotlin'dagi barcha sinflar 'final', ya'ni meros qilib olinmaydi. Meros qilishga ruxsat berish uchun, sinf aniq open kalit so'zi bilan belgilanishi kerak.
Sinflar merosi:
open class Shape { // Asosiy sinf, open sifatida belgilangan
open fun draw() { // O'zgartirilishi mumkin bo'lgan metod
println("Shakl chizish")
}
}
class Circle : Shape() { // Shape'dan meros oladi
override fun draw() { // Metodni o'zgartirish
println("Doira chizish")
}
}
Qarindosh sinfning konstruktorida, asosiy sinf konstruktorini aniq yoki noaniq chaqirish kerak.
Interfeyslar:
Kotlin'dagi interfeyslar Java 8'dakilar bilan o'xshash bo'lib, abstrakt metodlar va bajarilgan metodlarni o'z ichiga olishi mumkin. Sinflar bitta yoki bir nechta interfeyslarni amalga oshirishi mumkin.
interface Drawable {
fun draw() // Abstrakt metod
fun description() { // Standart bajarilgan metod
println("Bu chiziladigan ob'ekt")
}
}
class Square : Drawable {
override fun draw() { // Abstrakt metodni amalga oshirish
println("Kvadrat chizish")
}
// description() ni o'zgartirish mumkin, lekin majburiy emas
}
Polimorfizm:
Kotlin'da polimorfizm, umumiy bazaviy tur (sinf yoki interfeys) orqali turli sinflardagi ob'ektlar bilan ishlash imkoniyati bilan erishiladi. Bu, bajarilish vaqtida ob'ektning haqiqiy turiga xos metodlarni chaqirishga imkon beradi.
fun render(drawable: Drawable) {
drawable.draw() // Ob'ektning haqiqiy turiga qarab draw() metodini chaqirish
drawable.description()
}
fun main() {
val circle: Shape = Circle() // Circle ob'ekti Shape sifatida ko'rib chiqiladi
circle.draw() // Polimorfizm tufayli Circle'dan draw() chaqiriladi
val square: Drawable = Square() // Square ob'ekti Drawable sifatida ko'rib chiqiladi
render(square) // Square'dan draw() va description() chaqiriladi
}
Ushbu misolda, render har qanday Drawableni amalga oshiradigan ob'ekt bilan ishlaydi. drawable.draw() chaqiruvi, ob'ektning haqiqiy turiga mos draw metodining bajarilishini ta'minlaydi (Square holatida).
Sinflar merosi va interfeyslar bilan amalga oshirish o'rtasidagi farqlar:
- Sinf merosi: "bir narsa" (is-a) munosabatini o'rnatadi. Pusha sinf, asosiy sinfning holati va xulq-atvorini meros oladi.
- Interfeysni amalga oshirish: "qobiliyat" yoki "shartnoma"ni belgilaydi. Sinf, barcha abstrakt metodlarning bajarilishini ta'minlashga va'da beradi.
Taqqoslash jadvali:
| Xususiyat | Sinf merosi | Interfeysni amalga oshirish |
|---|---|---|
| Aloqa turi | is-a | Qobiliyat / Shartnoma |
| Ko'p meroslik | Yagona | Ko'pchilik |
| Holat | Asosiy sinf holatini meros oladi | Holat meros olmaydi |
| Metodlarning bajarilishi | Bajarilishi mumkin bo'lgan bajarish | Standart bajarilishi mumkin (Java 8 dan boshlab) |