Załóżmy, że mam bardzo skomplikowaną specyfikację zdefiniowany jako interfejs:Kotlin delegacja do wyrażania zamiast stałym odniesieniem
interface Spec {
fun sayHello()
}
a standardowym realizacji:
class Impl(private val msg: String) : Spec {
override fun sayHello() {
println(msg)
}
}
Załóżmy teraz, że chcę, aby utworzyć klasa implementująca tę specyfikację i delegująca do implementacji, ale dokładny obiekt delegata jest modyfikowany przez cały okres istnienia obiektu. Oto przykład:
class Derived(var target: Spec) : Spec by target
Problem z powyższym przykładzie jest to, że argument konstruktora target
jest ustawiony jako obiekt delegata gdy konstruktor jest tzw. Dostęp do uczestnika jest wówczas możliwy bezpośrednio przez klasę zamiast wykonywania dostępu do właściwości. (Zostało to potwierdzone przez przeglądanie kodu bajtowego produkowanego przez Kotlin.)
Tak więc, nawet jeśli właściwość target
została zmodyfikowana po skonstruowaniu klasy, delegat się nie zmienia.
Czy ktokolwiek może przedstawić metodę wykonywania tej delegacji w Kotlinie bez konieczności wypisywania każdej metody?
Idealne rozwiązanie umożliwiłoby również delegowanie do czegoś tak ogólnego, jak lambda lub inne wyrażenie, które byłoby oceniane i używane jako delegat, ilekroć delegat jest potrzebny przez cały okres istnienia obiektu.
W tym przypadku musisz ręcznie przekazać wszystkie metody, których autor stara się uniknąć. – Michael
@Michael tak, to prawda, jednak muszę tylko wykonać ręczną delegację tylko raz dla 'Posiadacza', po czym mogę go używać bez dodatkowego zestawu znaków – voddan
Nie potrzebujesz do tego żadnych dodatkowych zajęć. Po prostu przekazuj wszystko od "Pochodnego". – Michael