Sobes.tech
Junior

Co jsou rozšíření v jazyce Kotlin?

sobes.tech AI

Odpověď od AI

Rozšíření v Kotlinu umožňují přidávat nové funkce nebo vlastnosti ke stávajícím třídám bez dědičnosti nebo použití dekorátorů.

Hlavní koncepty:

  • Rozšiřující funkce: Přidávají nové metody ke třídám.

    // Definice rozšiřující funkce
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Použití rozšiřující funkce
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString bude "HelloWorld"
    

    Klíčové slovo this uvnitř rozšiřující funkce odkazuje na objekt, na který je volána (v příkladu výše myString).

  • Rozšiřující vlastnosti: Umožňují přidávat nové vlastnosti ke třídám, ale nemohou mít stav, tj. nemohou ukládat data. Jsou vypočítávány při každém přístupu.

    // Definice rozšiřující vlastnosti
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Použití rozšiřující vlastnosti
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // 2
    

    Rozšiřující vlastnosti musí mít getter. Setter je volitelný.

Vlastnosti:

  • Statická dispatch: Volání rozšíření je určeno typem proměnné, nikoli typem objektu za běhu. To se liší od virtuálních metod v objektově orientovaném programování.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // Vytiskne "Parent", protože typ proměnné 'p' je Parent
    
  • Privátní a chráněné členy: Rozšíření nemohou přistupovat k privátním nebo chráněným členům třídy, kterou rozšiřují.

  • Rozšíření v companion object: Můžete rozšířit objekty companion třídy.

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Companion")
    
    MyClass.printName() // Vytiskne "MyClass Companion"
    
  • Viditelnost: Rozšíření musí být deklarována v souboru a poté importována pro použití v jiných souborech.

Rozšíření jsou mocným nástrojem pro vytváření čitelného a flexibilního kódu, umožňující přidávat funkčnost ke třídám z knihoven třetích stran bez změny jejich zdrojového kódu.