რა არის თვისებების დელეგატების თავისებურება?
sobes.tech AI
პასუხი AI-სგან
Kotlin-ში მემკვიდრეობის დელეგატები საშუალებას აძლევს გადმოიტანოთ მემკვიდრეობის წაკითხვის და დაწერის ლოგიკა ცალკეულ დამხმარე კლასზე, რომელსაც უწოდებენ დელეგატს.
სინათლე:
-
getValueდაsetValue-ის გაგება: წაკითხული მემკვიდრეობებისთვის (val) დელეგატს უნდა ჰქონდესgetValueმეთოდი. წაკითხული და დაწერადი მემკვიდრეობებისთვის (var) დელეგატს უნდა ჰქონდეს როგორცgetValue, ასევეsetValue. ამ მეთოდებს პარამეტრებად მიეწოდება:- ობიექტის სიგნალი, რომელიც შეიცავს მემკვიდრეობას (კლასის წევრებისთვის).
KPropertyობიექტის სახით მემკვიდრეობის მეტადატა.
-
სტანდარტული დელეგატები: Kotlin-ს აქვს რამდენიმე სტანდარტული დელეგატი:
lazy: მემკვიდრეობის დაგვიანებული ინიციალიზაცია.observable: გარკვეული მოქმედების შესრულება მემკვიდრეობის მნიშვნელობის ცვლილებისას.vetoable: გარკვეული მოქმედების შესრულება მემკვიდრეობის მნიშვნელობის ცვლილებისას, ცვლილების გაუქმების შესაძლებლობით.- Map-ის დელეგატები: მემკვიდრეობა შეიძლება იყოს
Map-ში.
-
საკუთარი დელეგატები: შესაძლებელია შექმნათ საკუთარი კლასი-დელეგატები. კლასი უნდა იმუშაოს
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()
}