Hi is there a way to solve the diamond problem with delegation? getting crazy trying different solutions and can’t find a way to have the last object to behave properly: Here’s my test code:
interface C {
var a: Int
}
class Ci : C {
override var a: Int = 1
}
interface A: C {
//var a: Int
val f: String
}
interface B: C {
//var a: Int
val g: String
}
class Ai(ci: Ci = Ci()): A, C by ci {
override val f: String = "class A"
}
class Bi(ci: Ci = Ci()): B, C by ci {
override val g: String = "class B"
}
class Xi(val ci: Ci = Ci(), val ai: Ai = Ai(ci), val bi: Bi = Bi(ci)): C by ci, A by ai, B by bi {
val h: String = "class X"
override var a = ci.a
}
fun main() {
val a = Ai()
val b = Bi()
println(a.f)
println(b.g)
val x = Xi()
println("${x.a} ${x.ci.a} ${x.ai.a} ${x.bi.a}")
x.a = 2
println("${x.a} ${x.ci.a} ${x.ai.a} ${x.bi.a}")
x.ci.a = 3
println("${x.a} ${x.ci.a} ${x.ai.a} ${x.bi.a}")
x.ai.a = 4
println("${x.a} ${x.ci.a} ${x.ai.a} ${x.bi.a}")
x.bi.a = 5
println("${x.a} ${x.ci.a} ${x.ai.a} ${x.bi.a}")
}
it prints the following:
class A
class B
1 1 1 1
2 1 1 1
2 3 3 3
2 4 4 4
2 5 5 5
In C/C++ what I would try to do is to have a reference pointing to ci.a but in kotlin i dunno what to do. Also is pretty stupid it says “Class ‘Xi’ must override public open var a: Int defined in Xi because it inherits many implementations of it” because it’s clearly the same object.