Sobes.tech
Junior

Kotlinде мурас жана көп формачылык кандай уюштурулган?

sobes.tech AI

AIден жооп

Котлинде мурас алуу механизмдери класстар жана интерфейстер аркылуу ишке ашырылат. Класстар башка бир классты гана мурас кыла алат (бирдиктүү мурас алуу), бирок бир нече интерфейстерди ишке ашыра алат.

Калыптанча, бардык класстар Kotlinде 'финалдык', башкача айтканда мурас алуу мүмкүн эмес. Мурас алуу мүмкүнчүлүгүн берүү үчүн, класс так белгилениши керек open ачкыч сөзү менен.

Класстарды мурас алуу:

open class Shape { // Негизги класс, open деп белгиленген
    open fun draw() { // Метод, кайра аныкталышы мүмкүн
        println("Drawing a shape")
    }
}

class Circle : Shape() { // Shape классынан мурас алуу
    override fun draw() { // Методду кайра аныктоо
        println("Drawing a circle")
    }
}

Түзүүчү класстын конструкторунда негизги класс конструкторун ачык же жашыруун түрдө чакырышы керек.

Интерфейстер:

Котлиндеги интерфейстер Java 8дегидей, жана аларда абстракттык методдор жана денеси бар ишке ашырылган методдор болушу мүмкүн. Класстар бир нече интерфейсти ишке ашыра алат.

interface Drawable {
    fun draw() // Абстракттык метод
    fun description() { // Ишке ашырылган метод
        println("This is a drawable object")
    }
}

class Square : Drawable {
    override fun draw() { // Абстракттык методду ишке ашыруу
        println("Drawing a square")
    }
    // description() кайра аныкталышы мүмкүн, бирок милдеттүү эмес
}

Полиморфизм:

Котлинде полиморфизм, бир эле учурда, ар кандай класстардын объекттери менен иштөө мүмкүнчүлүгү аркылуу ишке ашырылат. Бул конкреттүү объекттин түрүнө карабастан, методдорду чакырууга мүмкүндүк берет, ишке ашырылуу учурунда.

fun render(drawable: Drawable) {
    drawable.draw() // Методдун чакырылышы, реалдуу объекттин түрүнө жараша
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Объект Shape катары каралат
    circle.draw() // draw() чакырышы, полиморфизм аркылуу

    val square: Drawable = Square() // Объект Drawable катары каралат
    render(square) // draw() жана description() чакырышы Square үчүн
}

Бул мисалда render кез келген Drawable ишке ашырган объект менен иштейт. drawable.draw() чакырышы, конкреттүү объекттин draw методуна ишке ашырылат (Square учурда).

Класстарды мурас алуу жана интерфейстерди ишке ашыруу арасындагы айырма:

  • Класстын мурас алуу: "is-a" мамилесин аныктайт. Түзүүчү класс негизги класс абалын жана жүрүм-турумун мурас алат.
  • Интерфейсти ишке ашыруу: "кабилдик" же "шарт" аныктайт. Класс бардык абстракттык методдорду ишке ашырат деп убада берет.

Салыштырма таблица:

Өзгөчөлүк Класстардын мурас алуу Интерфейстерди ишке ашыруу
Байланыш түрү is-a Кабилдик / Шарт
Көптөгөндүк Бир гана Көптөгөн
Абалы Базалык класстын абалын мурас алат Абалы мурас албайт
Методдорду ишке ашыруу Реализацияны камтышы мүмкүн Туура келгенде, алдын ала аныкталган (Java 8ден баштап)