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
    

    Хосиятҳои тавзењ бояд геттер дошта бошанд. Сеттери он интихобӣ аст.

Хусусиятҳо:

  • Диспетчеризатсияи статикӣ: Зов кардани тавзењ ба навъе муайян мешавад, ки навъи тағирёбанда, на навъи объект дар вақти иҷро. Ин аз методҳои виртуалӣ дар барномасозии объектӣ фарқ мекунад.

    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
    
  • Ҳуҷраҳои private ва protected: Тавзењҳо наметавонанд ба ҳуҷраҳои private ё protected дар синфе, ки онҳо тавзењ дода шудаанд, дастрасӣ пайдо кунанд.

  • Тавзењҳо барои объекти-компаньон: Мумкин аст, ки объектҳои-компаньонро тавзењ дод.

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Companion")
    
    MyClass.printName() // Натиҷа "MyClass Companion" хоҳад буд
    
  • Диапазони намоиш (Visibility): Тавзењҳо бояд дар файл эълон шаванд ва сипас барои истифода дар дигар файлҳо ворид карда шаванд.

Тавзењҳо воситаи қавӣ барои сохтани коди хонданӣ ва чандир мебошанд, ки имкон медиҳанд, ки функсионалиятро ба синфҳо аз китобхонаҳои беруна илова кунанд, бе тағир додани коди манбаъии онҳо.