Sobes.tech
Junior

Ի՞նչ են ընդարձակումները Kotlin ծրագրավորման լեզվում։

sobes.tech AI

Պատասխան AI-ից

Կատարման ընդլայնումները Kotlin- ում թույլ են տալիս ավելացնել նոր ֆունկցիաներ կամ հատկություններ գոյություն ունեցող դասերին առանց ժառանգության կամ դեկորատորի օգտագործման:

Հիմնական գաղափարներ:

  • Ընդլայնման ֆունկցիաներ (Extension Functions): Ավելացնում են նոր մեթոդներ դասերին:

    // Ընդլայնման ֆունկցիայի սահմանում
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Ընդլայնման ֆունկցիայի օգտագործում
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString կլինի "HelloWorld"
    

    this բառը ընդլայնման ֆունկցիայի ներսում հղում է այն օբյեկտին, որի վրա կիրառվում է ընդլայնումը (այստեղ՝ myString):

  • Ընդլայնման հատկություններ (Extension Properties): Ավելացնում են նոր հատկություններ դասերին, բայց չեն կարող ունենալ վիճակ, այսինքն՝ չեն կարող պահել տվյալներ:

    // Ընդլայնման հատկության սահմանում
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Օգտագործում
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // indexLast կլինի 2
    

    Ընդլայնման հատկությունները պետք է ունենան getter, setter-ը՝ ընտրովի:

Հատկանշական առանձնահատկություններ:

  • Ստատիկ դիսպետչերիզացիա: Ընդլայնման կանչը որոշվում է փոփոխականի տիպով, ոչ՝ օբյեկտի ժամանակի տիպով:

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // Տպում է "Parent"՝ քանի որ `p` փոփոխականի տիպը՝ Parent
    
  • Անհատական և պաշտպանված անդամներ: Ընդլայնումները չեն կարող դիմել անհատական կամ պաշտպանված անդամներին:

  • Ընդլայնումներ դասի-կոմպանիոնների համար: Կարող են ընդլայնել դասի-կոմպանիոնները:

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Կոմպանիոն")
    
    MyClass.printName() // Տպում է "MyClass Կոմպանիոն"
    
  • Տեսանելիության տարածք (Visibility): Ընդլայնումները պետք է հայտարարվեն ֆայլում և ներմուծվեն՝ օգտագործելու համար այլ ֆայլերում:

Ընդլայնումները հզոր գործիք են կոդը ընթեռնելի և ճկուն դարձնելու համար, թույլ են տալիս ավելացնել ֆունկցիոնալություն արտաքին գրադարանների դասերին՝ առանց նրանց սկզբնական կոդը փոփոխելու: