Kotlin的循环检测实现问题
刚才写代码时遇到了一个问题,很有趣
但是代码太复杂,我把它化简了一下:
类A继承了一个接口,并将该接口实现委托给类B
但类B继承了类A,所以该接口实现将交给类A
但类A的该接口实现已经委托给类B
然后这两个卧龙凤雏就开始互相推卸责任了…
可以看到,这是一个循环检测实现问题,看图:
到了要调用接口属性或方法时,无论找类A还是找类B,它们都没有实现接口属性和方法,它们都将责任推卸给对方
看代码:
interface RootInterface {
//定义了一个需要继承该接口的类要实现的属性与函数
val value:Int
fun function()
}
open class ClassA :RootInterface by ClassB(){
//没有实现接口
}
class ClassB : ClassA() {
//没有实现接口
}
fun main() {
//你们都没有实现接口,那我调用接口上的值或函数,该找谁???
ClassA().value
ClassB().function()
}
一运行,直接抛出StackOverflowError,在栈中互相推卸责任
把栈堆爆了
当然,也不是没有解决方案的
先看图:
如果类B不实现接口属性与函数,编译是通不过的
除非类B将该接口实现委托(推卸)给类A:
那这样,调用图就成: