Sobes.tech
Junior

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)