Mis on laiendused Kotlin programmeerimiskeeles?
sobes.tech AI
Vastus AI-lt
Kotlin laiendused võimaldavad lisada uusi funktsioone või omadusi olemasolevatele klassidele ilma pärimiseta või dekoratori kasutamiseta.
Põhikonseptsioonid:
-
Laienduste funktsioonid (Extension Functions): Lisavad uusi meetodeid klassidele.
// Laienduse funktsiooni defineerimine fun String.removeWhitespaces(): String { return this.filter { it.isWhitespace().not() } } // Laienduse funktsiooni kasutamine val myString = " Hello World " val cleanedString = myString.removeWhitespaces() // cleanedString on "HelloWorld"Sõna
thislaienduse funktsiooni sees viitab objekti, millele laiendus rakendub (antud näitesmyString). -
Laienduste omadused (Extension Properties): Annab võimaluse lisada uusi omadusi klassidele, kuid ei saa omada olekut, st. andmeid salvestada:
// Laienduse omaduse defineerimine val <T> List<T>.lastIndex: Int get() = size - 1 // Kasutamine val myList = listOf(1, 2, 3) val indexLast = myList.lastIndex // indexLast on 2Laienduse omadustel peab olema getter, setter on valikuline.
Omadused:
-
Statiline dispetcherimine: Laienduse väljakutse määratakse muutuja tüübi järgi, mitte objekti käivitamise ajal. See erineb virtuaalsetest meetoditest objekti-orienteeritud programmeerimises.
open class Parent class Child : Parent() fun Parent.printType() = println("Parent") fun Child.printType() = println("Child") val p: Parent = Child() p.printType() // Kuvab "Parent", sest `p` tüüp on Parent -
Privaatsed ja kaitstud liikmed: Laiendused ei saa ligi pääseda klassi privaatsetele või kaitstud liikmetele, mida nad laiendavad.
-
Kompaniiooni objekti laiendused: Võimalik laiendada klassi kompanii objekti:
class MyClass { companion object { fun create() = MyClass() } } fun MyClass.Companion.printName() = println("MyClass kompanii") MyClass.printName() // Kuvab "MyClass kompanii" -
Nähtavuse ulatus (Visibility): Laiendused peavad olema deklareeritud failis ja importima neid teiste failide kasutamiseks.
Laiendused on võimas tööriist loetava ja paindliku koodi loomiseks, võimaldades lisada funktsionaalsust klassidele väljastpoolt, ilma nende algset koodi muutmata.