Sobes.tech
Junior

Kaip organizuotas paveldėjimas ir polimorfizmas Kotlin?

sobes.tech AI

Atsakymas iš AI

Kotlin'e paveldėjimas įgyvendinamas per klasių ir sąsajų mechanizmą. Klasės gali paveldėti tik vieną kitą klasę (viengubas paveldėjimas), tačiau gali įgyvendinti kelias sąsajas.

Pagal numatytuosius nustatymus, visos Kotlin klasės yra 'galutinės', tai yra, jų paveldėjimas nėra leidžiamas. Norint leisti paveldėjimą, klasė turi būti aiškiai pažymėta raktažodžiu open.

Klasės paveldėjimas:

open class Shape { // Pagrindinė klasė, pažymėta kaip open
    open fun draw() { // Metodas, kurį galima perrašyti
        println("Drawing a shape")
    }
}

class Circle : Shape() { // Paveldi iš Shape
    override fun draw() { // Perrašo metodą
        println("Drawing a circle")
    }
}

Paveldimos klasės konstruktoriuje būtina iškviesti pagrindinės klasės konstruktorių, aiškiai arba neaiškiai.

Sąsajos:

Kotlin'e sąsajos yra panašios į Java 8 ir gali turėti abstrakčius metodus ir įgyvendintus metodus su kūnu. Klasės gali įgyvendinti vieną ar daugiau sąsajų.

interface Drawable {
    fun draw() // Abstraktus metodas
    fun description() { // Numatytoji įgyvendinimo metodas
        println("This is a drawable object")
    }
}

class Square : Drawable {
    override fun draw() { // Įgyvendina abstraktų metodą
        println("Drawing a square")
    }
    // description() gali būti perrašyta, bet nebūtina
}

Polimorfizmas:

Kotlin'e polimorfizmas pasiekiamas per galimybę dirbti su skirtingų klasių objektais per bendrą pagrindinį tipą (klasę ar sąsają). Tai leidžia iškviesti metodus, būdingus konkrečiam objekto tipui, vykdymo metu.

fun render(drawable: Drawable) {
    drawable.draw() // Iškviečia draw() metodą pagal faktinį objekto tipą
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Objektas, laikomas kaip Shape
    circle.draw() // Iškviečia draw() iš Circle dėl polimorfizmo

    val square: Drawable = Square() // Objektas, laikomas kaip Drawable
    render(square) // Iškviečia draw() ir description() iš Square
}

Šiame pavyzdyje render veikia su bet kokiu objektu, įgyvendinančiu Drawable. drawable.draw() iškvietimas vykdys draw metodo įgyvendinimą konkrečiam objekto tipui (Square).

Skirtumas tarp klasių paveldėjimo ir sąsajų įgyvendinimo:

  • Klasės paveldėjimas: nustato "yra" (is-a) santykį. Paveldėta klasė paveldi būseną ir elgesį iš pagrindinės klasės.
  • Sąsajos įgyvendinimas: apibrėžia "gebėjimą" arba "sutartį". Klasė žada suteikti įgyvendinimą visų abstrakčių sąsajos metodų.

Lentelė palyginimui:

Savybė Klasės paveldėjimas Sąsajos įgyvendinimas
Ryšio tipas yra (is-a) gebėjimas / sutartis
Daugybė vienkartinė daugkartinė
Būklė paveldi būseną iš pagrindinės klasės ne paveldi būseną
Metodų įgyvendinimas gali turėti įgyvendinimą gali turėti numatytą įgyvendinimą (nuo Java 8)