Sobes.tech
Junior

Kā Kotlin organizē mantošanu un polimorfismu?

sobes.tech AI

Atbilde no AI

Kotlin mantošana tiek īstenota caur klases un interfeisa mehānismu. Klases var manto tikai vienu citu klasi (viena mantošana), bet var īstenot vairākus interfeisus.

Pēc noklusējuma visas Kotlin klases ir 'final', tas ir, tās nevar tikt mantotas. Lai atļautu mantošanu, klasei jābūt skaidri marķētai ar atslēgvārdu open.

Klases mantošana:

open class Shape { // Bāzes klase, marķēta kā open
    open fun draw() { // Metode, kuru var pārrakstīt
        println("Zīmē formu")
    }
}

class Circle : Shape() { // Manto no Shape
    override fun draw() { // Pārrakstīt metodi
        println("Zīmē riņķi")
    }
}

Bērna klases konstruktorā ir jāizsauc bāzes klases konstruktors, skaidri vai netieši.

Interfeisi:

Kotlin interfeisi ir līdzīgi Java 8 interfeisiem un var saturēt abstraktas metodes un ar ķermeni aprīkotas metodes. Klases var īstenot vienu vai vairākus interfeisus.

interface Drawable {
    fun draw() // Abstrakta metode
    fun description() { // Metode ar noklusējuma realizāciju
        println("Šis ir zīmējams objekts")
    }
}

class Square : Drawable {
    override fun draw() { // Abstraktās metodes realizācija
        println("Zīmē kvadrātu")
    }
    // description() var tikt pārrakstīts, bet tas nav obligāti
}

Polimorfisms:

Polimorfisms Kotlin tiek sasniegts, ļaujot strādāt ar dažādu klases objektiem caur kopēju bāzes tipu (klasi vai interfeisu). Tas ļauj izsaukt metodes, kas ir specifiskas konkrētam objekta tipam, izpildes laikā.

fun render(drawable: Drawable) {
    drawable.draw() // Metodes draw() izsaukšana atkarībā no faktiskā objekta tipa
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Riņķa objekts tiek uzskatīts par Shape
    circle.draw() // Izsauc draw() no Circle, pateicoties polimorfismam

    val square: Drawable = Square() // Kvadrāta objekts tiek uzskatīts par Drawable
    render(square) // Izsauc draw() un description() no Square
}

Šajā piemērā render strādā ar jebkuru objektu, kas īsteno Drawable. Izsaukums drawable.draw() izpildīs draw metodi konkrētā objekta tipam (Square šajā gadījumā).

Atšķirība starp klases mantošanu un interfeisa īstenošanu:

  • Klases mantošana: Nosaka attiecību "ir-šis" (is-a). Bērna klase manto stāvokli un uzvedību no bāzes klases.
  • Interfeisa īstenošana: Nosaka "spēju" vai "līgumu". Klase apņemas nodrošināt visu abstraktu metožu realizāciju interfeisā.

Salīdzināšanas tabula:

Īpašība Klases mantošana Interfeisa īstenošana
Attiecību veids ir-a Spēja / Līgums
Daudzveidība Viena mantošana Daudzveidīga
Stāvoklis Manto bāzes klases stāvokli Ne manto stāvokli
Metožu realizācija Var saturēt realizāciju Var saturēt noklusējuma realizāciju (no Java 8)