-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdelegation.kt
86 lines (72 loc) · 2.29 KB
/
delegation.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// PATTERN
interface Base {
val text: String
fun show()
fun showFull()
}
class BaseImpl(text: String) : Base {
override val text = "Delegate implementation: $text"
override fun show() { print(text) }
override fun showFull() { print("Delegate implementation full info: + $text") }
}
class Derived(delegate: Base) : Base by delegate
val base = BaseImpl("value")
val derived = Derived(base)
derived.show() //Delegate implementation: value
// OVERRIDE
class Derived(delegate: Base) : Base by delegate {
override val text = "Overriden implementation: $text"
override fun showFull() { print("Overriden implementation full info: $text") }
}
val base = BaseImpl("value")
val derived = Derived(base)
derived.show() //Delegate implementation: value
print(derived.text) //Overriden implementation: value
derived.showFull() //Overriden implementation full info: value
// PROPERTIES
class DelegatedProperty {
var value: String by Delegate()
}
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "get '${property.name}' has been delegated"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
print("set '${property.name}' = $value has been delegated")
}
}
val delegated = DelegatedProperty()
print(delegated.value) //get 'value' has been delegated
delegated.value = "new one" //set 'value' = new one has been delegated
// LAZY PROPERTY
val lazyValue: String by lazy {
print("evaluated ")
"value"
}
print(lazyValue) //evaluted value - at first time is computed
print(lazyValue) //value - is computed already
// OBSERVABLE PROPERTY
class Person {
var name: String by Delegates.observable("No name ") {
property, old, new ->
print("$old changed to $new")
}
}
val person = Person()
person.name = "Johnnie" //No name changed to Johnnie
person.name = "Jack" //Johnnie changed to Jack
// STORING IN MAP
class Worker(var map: MutableMap<String, Any?>) {
var name: String by map
var salary: Int by map
}
//execute constructor with init values
var map: MutableMap<String, Any?> = mutableMapOf(
"name" to "William",
"salary" to 2000
)
val worker = Worker(map)
print(worker.name) //William
print(worker.salary) //2000
map.set("salary", 3000)
println(worker.salary) //3000