Sobes.tech
Middle

რა არის თვისებების დელეგატების თავისებურება?

sobes.tech AI

პასუხი AI-სგან

Kotlin-ში მემკვიდრეობის დელეგატები საშუალებას აძლევს გადმოიტანოთ მემკვიდრეობის წაკითხვის და დაწერის ლოგიკა ცალკეულ დამხმარე კლასზე, რომელსაც უწოდებენ დელეგატს.

სინათლე:

  1. getValue და setValue-ის გაგება: წაკითხული მემკვიდრეობებისთვის (val) დელეგატს უნდა ჰქონდეს getValue მეთოდი. წაკითხული და დაწერადი მემკვიდრეობებისთვის (var) დელეგატს უნდა ჰქონდეს როგორც getValue, ასევე setValue. ამ მეთოდებს პარამეტრებად მიეწოდება:

    • ობიექტის სიგნალი, რომელიც შეიცავს მემკვიდრეობას (კლასის წევრებისთვის).
    • KProperty ობიექტის სახით მემკვიდრეობის მეტადატა.
  2. სტანდარტული დელეგატები: Kotlin-ს აქვს რამდენიმე სტანდარტული დელეგატი:

    • lazy: მემკვიდრეობის დაგვიანებული ინიციალიზაცია.
    • observable: გარკვეული მოქმედების შესრულება მემკვიდრეობის მნიშვნელობის ცვლილებისას.
    • vetoable: გარკვეული მოქმედების შესრულება მემკვიდრეობის მნიშვნელობის ცვლილებისას, ცვლილების გაუქმების შესაძლებლობით.
    • Map-ის დელეგატები: მემკვიდრეობა შეიძლება იყოს Map-ში.
  3. საკუთარი დელეგატები: შესაძლებელია შექმნათ საკუთარი კლასი-დელეგატები. კლასი უნდა იმუშაოს ReadOnlyProperty (val-ისთვის) ან ReadWriteProperty (var-ისთვის) ინტერფეისებს:

lazy გამოყენების მაგალითი:

// ველი ინიციალიზდება მხოლოდ პირველ წვდომაზე
val lazyValue: String by lazy { 
    println("მნიშვნელობის გამოთვლა")
    "Hello"
}

observable გამოყენების მაგალითი:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<არასახელო>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

მომხმარებლის მიერ შექმნილი დელეგატის მაგალითი:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, მემკვიდრეობის სახელის '${property.name}'"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, მემკვიდრეობის '${property.name}'' მნიშვნელობა შეიცვალა — '$value'")
    }
}

class Example {
    var p: String by Delegate()
}