Вы можете создать свойство делегата, предназначенное для определенного типа получателя c. Он может быть использован только внутри этого класса и его подклассов, но у вас будет доступ к его функциям и свойствам.
Например, вы можете создать класс, который подсчитывает вызовы любых его свойств, использующих делегат. :
open class Ticker {
var ticks = 0
private set
class CountedAccess<T> (private val value: T) : ReadOnlyProperty<Ticker, T> {
override fun getValue(thisRef: Ticker, property: KProperty<*>): T {
thisRef.ticks++
return value
}
}
}
Тогда подкласс будет отслеживать количество вызовов к любому из своих делегированных свойств:
fun main() {
class Something: Ticker() {
val foos by CountedAccess(5)
val bar by CountedAccess("Hello, world!")
}
val something = Something().apply {
repeat(Random.nextInt(3)) {
println("Number of foos is $foos")
repeat(Random.nextInt(3)) {
println("Bar says $bar")
}
}
}
println("Something's properties were accessed ${something.ticks} times.")
}