Kotlin的循环检测实现问题

Kotlin的循环检测实现问题

刚才写代码时遇到了一个问题,很有趣
但是代码太复杂,我把它化简了一下:

类A继承了一个接口,并将该接口实现委托给类B

但类B继承了类A,所以该接口实现将交给类A

但类A的该接口实现已经委托给类B

然后这两个卧龙凤雏就开始互相推卸责任了…

可以看到,这是一个循环检测实现问题,看图:

接口 类A 类B 你要实现value,function() 委托你帮我实现一下alue,function() 我不想实现alue,function(),你是我父类,你帮我帮类A实现 好,我委托类B帮我帮你帮类A实现 委托你帮我帮类B帮类A实现一下alue,function() 我不想实现alue,function(),你是我父类,你帮我帮类A帮类B帮类A实现 好,我委托类B帮我帮类A帮类B帮类A实现一下alue,function() 然后就一直循环下去了...... 接口 类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,在栈中互相推卸责任

把栈堆爆了

在栈中互相推卸责任,把栈堆爆了

当然,也不是没有解决方案的

先看图:

接口 类A 类B 你要实现value,function() 委托你帮我实现一下alue,function() 我不想实现alue,function(),但我没办法将责任推卸给你 于是类B实现了接口的属性与函数 接口 类A 类B

如果类B不实现接口属性与函数,编译是通不过的

如果类B不实现接口属性与函数,编译是通不过的

除非类B将该接口实现委托(推卸)给类A:

你干嘛~~~
那这样,调用图就成:

接口 类A 类B 你要实现value,function() 委托你帮我实现一下alue,function() 我不想实现alue,function(),委托你帮我帮类A实现 好,我委托类B帮我帮你帮类A实现 委托你帮我帮类B帮类A实现一下alue,function() 我不想实现alue,function(),委托你帮我帮类A帮类B帮类A实现 好,我委托类B帮我帮类A帮类B帮类A实现一下alue,function() 然后又一直循环下去了......焯 接口 类A 类B

Kotlin对此没有任何提示,希望大家注意点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值