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) |