“接口代码”Kotlin,他们如何避免“致命的死亡钻石”?

时间:2017-10-24 07:52:14

标签: interface kotlin diamond-problem

我正在阅读this文章,它说你可以在Kotlin界面中编写代码。 Java不允许在接口中编写代码以避免钻石问题answer。如果Kotlin允许接口中的代码和多个接口可以在类中实现,那么这不会再次创建“钻石问题”吗?

1 个答案:

答案 0 :(得分:2)

情景1

两个接口具有相同签名的方法,并且两者都没有在接口中实现,那么它需要实现具有相同签名的方法单个方法。

实施例

interface InterfaceA {
    fun sum(a: Int, b: Int)
}

interface InterfaceB {
    fun sum(x: Int, y: Int)
}

class TestClass : InterfaceA, InterfaceB {
    override fun sum(x: Int, y: Int) {
       return a+b
   }
}

情景2

两个接口具有相同签名的方法,不同的返回类型在这种情况下将是错误

实施例

interface InterfaceA {
    fun sum(a: Int, b: Int):Int = a+b
}

interface InterfaceB {
    fun sum(x: Int, y: Int)
}

class TestClass : InterfaceA, InterfaceB {
    override fun sum(x: Int, y: Int) {
       return a+b
   }
}

在这种情况下,编译器显示错误,因为两个方法必须具有相同的返回类型

钻石问题与Kotlin以及Java中不允许的类的多重继承相关联,尽管您可以通过实现具有两个接口的接口来创建钻石形状的场景,然后在kotlin中您需要覆盖所有方法这是一个编译时错误,这可以避免钻石形状问题。

实施例

interface InterfaceA {
    fun sum(a: Int, b: Int): Int {
        print("InterFaceA");
        return a + b
    }
}

interface InterfaceB:InterfaceA {
    override fun sum(a: Int, b: Int): Int {
        print("InterFaceB");
        return a + b
    }
}

interface InterfaceC:InterfaceA {
    override fun sum(a: Int, b: Int): Int {
        print("InterFaceC");
        return a + b
    }
}

interface InterfaceD : InterfaceB, InterfaceC {
    override fun sum(a: Int, b: Int): Int {
        print("InterFaceD");
        return a + b
    }
}

覆盖是必要的,否则编译器将显示错误并且不会继续进行。