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