Sobes.tech
Junior

Kuidas on Kotlinis organiseeritud pärimine ja polümorfism?

sobes.tech AI

Vastus AI-lt

Kotlin pärilusus realiseeritakse klasside ja liideste mehhanismi kaudu. Klassid võivad pärida ainult ühe teise klassi (ühekordne pärilus), kuid võivad rakendada mitmeid liideseid.

Vaikimisi on kõik Kotlin klassid 'lõplikud', see tähendab, et neid ei saa pärida. Päriluse lubamiseks peab klass olema selgelt märgitud võtmesõnaga open.

Klasside pärilus:

open class Shape { // Põhiklass, märgitud kui open
    open fun draw() { // Meetod, mida saab ülekirjutada
        println("Joonistame kuju")
    }
}

class Circle : Shape() { // Pärib Shape
    override fun draw() { // Meetodi ülekirjutamine
        println("Joonistame ringi")
    }
}

Alamklassi konstruktoris tuleb kutsuda põhiklassi konstruktor, kas otseselt või kaudselt.

Liidesed:

Kotlin liidesed on sarnased Java 8 liideste omadustega ning võivad sisaldada abstraktseid meetodeid ja vaikimisi rakendatud meetodeid. Klassid võivad rakendada ühte või mitut liidest.

interface Drawable {
    fun draw() // Abstraktne meetod
    fun description() { // Meetod vaikimisi rakendusega
        println("See on joonistatav objekt")
    }
}

class Square : Drawable {
    override fun draw() { // Abstraktse meetodi rakendamine
        println("Joonistame ruudu")
    }
    // description() võib olla ülekirjutatud, kuid see pole kohustuslik
}

Polümorfism:

Polümorfism saavutatakse Kotlinis võimalusega töötada erinevate klasside objektidega ühise baitypi (klass või liides) kaudu. See võimaldab kutsuda meetodeid, mis on spetsiifilised konkreetse objekti tüübi jaoks, jooksuaegsel.

fun render(drawable: Drawable) {
    drawable.draw() // Meetodi draw() väljakutse vastavalt objekti tegelikule tüübile
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Ring objekt käsitletakse kui Shape
    circle.draw() // Kutsub välja draw() Circle'ist, tänu polümorfismile

    val square: Drawable = Square() // Kvadraat käsitletakse kui Drawable
    render(square) // Kutsub välja draw() ja description() Square'ist
}

Selles näites töötab render mis tahes objektiga, mis rakendab Drawable. Kutse drawable.draw() täidab meetodi rakenduse konkreetse objekti tüübi jaoks (Square selles näites).

Klasse päriluse ja liidese rakendamise erinevus:

  • Klassi pärilus: Seob "on-" (is-a) suhte. Alamklass pärib põhiklassi oleku ja käitumise.
  • Liidese rakendamine: Määrab "võime" või "lepingu". Klass lubab endale täita kõiki abstraktseid meetodeid liidese sees.

Võrdlustabel:

Omadus Klassi pärilus Liidese rakendamine
Seose tüüp on-a Võime / Leping
Mitmekesisus Ühekordne Mitmekesine
Oleku Pärib põhiklassi oleku Ei pärine olekut
Meetodite rakendamine Võib sisaldada rakendust Võib sisaldada vaikimisi rakendust (Java 8-st alates)