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