Your suggestion definitely makes sense, but since teh value of the member may be changing over time, it's a separate feature deserving some special syntax. See thos request: http://youtrack.jetbrains.com/issue/KT-293
Hmm... I don't know how this would be handled internally in Kotlin, but from the outside point of view, I don't see any problem if the member value changes over time. Nullable types should not be allowed here, of cause. But as long as the member has the right type, there will be - by definition - always an object that the call can be delegated to.
I think that would also solve the issue you mentioned. If a get() function is defined for the member value, the delegation target would always be the result of that function. No syntax changes would be needed. But correct me, if I missed a problem here.
There are two problems:
1) Calling a delegated function in constructor before the corresponding value is initialized
2) Debugging probelms caused by changing gelegate objects
So we are strongly inclined to make the possibility of these problems visible
I have the same issue and interestingly it’s also with delegating to a Map. My example is passing url-parameters to Retrofit which need to be Map<String,String> so I wrote it like this:
class Filter(towns: Set<String> = setOf(),
queryParams: MutableMap<String,String>) : Map<String,String> by queryParams {
init {
queryParams.put("towns", towns.joinToString(","))
}
}
For serialization purposes, I would also rather have the queryParams as a delegated or lazy property.
Maybe what would help would be just an AbstractMap class (for Map, not for MutableMap) with just abstract val entries: Pair<K,V> to implement.
I have a similar problem and am curious if there is any better solution than what I did:
interface A {
fun foo()
}
internal class InternalA : A {
override fun foo() {}
internal fun secret() {}
}
open class Helper(a: A) : A by a {
internal val realA = a as InternalA
}
class B : Helper(InternalA()) {
fun bar() {
realA.secret()
}
}
To be clear, what I would like to do is to remove the Helper class like this:
interface A {
fun foo()
}
internal class InternalA : A {
override fun foo() {}
internal fun secret() {}
}
class B : A by realA {
val realA = InternalA()
fun bar() {
realA.secret()
}
}
interface A {
fun foo()
}
internal class InternalA : A {
override fun foo() {}
internal fun secret() {}
}
class B private constructor(private val a: InternalA) : A by a {
constructor() : this(InternalA())
fun bar() {
a.secret()
}
}