一、首先来看一个例子
package net.println.kotlin.chapter4
/**
* @author:wangdong
* @description:类实现接口的冲突问题
*/
interface B{
fun x(): Int = 1
}
interface C{
fun x(): Int = 0
}
/**一个类实现了两个接口,两个接口中的方法相同,这个类在覆写的时候就会出现冲突*/
class D: B,C{
//当下面两个方法同时存在的时候,就会报方法相同的冲突
override fun x(): Int {
return super<B>.x()
}
override fun x(): Int {
return super<C>.x()
}
}
二、解决冲突的例子
package net.println.kotlin.chapter4
/**
* @author:wangdong
* @description:类继承类,实现接口的方法冲突问题
* 接口方法可以有默认的实现
* 签名一致且返回值相同的冲突
* 子类(实现类)必须覆写冲突方法
* super<[父类(接口)名]>.[方法名]([参数列表])
*/
abstract class A{
open fun x(): Int = 5
}
interface B{
fun x(): Int = 1
}
interface C{
fun x(): Int = 0
}
/**一个类实现了两个接口,两个接口中的方法相同,这个类在覆写的时候就会出现冲突*/
/**采用分支模式解决冲突问题*/
class D(var y: Int = 0):A() ,B,C{
//返回值一定要一样啊,例如:一定要是Int
override fun x(): Int {
println("call x(): Int in D")
if (y > 0){
return y
}else if (y < -200){
return super<C>.x()
}else if (y < -100){
return super<B>.x()
}else{
return super<A>.x()
}
}
}
fun main(args: Array<String>) {
println(D(3).x())
println(D(-10).x())
println(D(-110).x())
println(D(-230).x())
}
/**输出的结果*/
call x(): Int in D
3
call x(): Int in D
5
call x(): Int in D
1
call x(): Int in D
0