Sobes.tech
Junior

Kas yra plėtiniai Kotlin programavimo kalboje?

sobes.tech AI

Atsakymas iš AI

Kotlin išplėtimai leidžia pridėti naujas funkcijas ar savybes prie esamų klasių be paveldėjimo ar dekoratoriaus naudojimo.

Pagrindinės koncepcijos:

  • Išplėtimo funkcijos (Extension Functions): Prideda naujus metodus prie klasių.

    // Išplėtimo funkcijos apibrėžimas
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Išplėtimo funkcijos naudojimas
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString bus "HelloWorld"
    

    Žodis this išplėtimo funkcijos viduje nurodo objektą, prie kurio taikomas išplėtimas (šiuo atveju myString).

  • Išplėtimo savybės (Extension Properties): Leidžia pridėti naujas savybes prie klasių, bet negali turėti būsenos, t.y. saugoti duomenis:

    // Išplėtimo savybės apibrėžimas
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Naudojimas
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // indexLast bus 2
    

    Išplėtimo savybės turi turėti getter, o setter yra pasirinktinai.

Ypatybės:

  • Statinė dispečerizacija: Išplėtimo iškvietimas yra nustatomas pagal kintamojo tipą, o ne objekto tipą vykdymo metu. Tai skiriasi nuo virtualių metodų objektų orientuotame programavime.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // Išves "Parent", nes `p` tipo - Parent
    
  • Privačios ir apsaugotos narės: Išplėtimo funkcijos negali pasiekti privačių ar apsaugotų klasės narių.

  • Kompaniijos objektų išplėtimas: Galima išplėsti klasės kompanijos objektus:

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass kompanijos pavadinimas")
    
    MyClass.printName() // Išves "MyClass kompanijos pavadinimas"
    
  • Matomumo sritis (Visibility): Išplėtimas turi būti deklaruotas faile ir importuotas naudoti kituose faile.

Išplėtimai yra galingas įrankis rašant skaitomą ir lankstų kodą, leidžiantį pridėti funkcionalumą prie klasių iš išorės, nekeičiant jų pradinio kodo.