gpt4 book ai didi

interface - "Code in Interfaces"Kotlin,他们如何避免 "deadly diamond of death"?

转载 作者:行者123 更新时间:2023-12-04 02:42:39 25 4
gpt4 key购买 nike

我正在阅读 this文章,它说您可以在 Kotlin 接口(interface)中编写代码。 Java 不允许在接口(interface)中编写代码以避免出现菱形问题 answer .如果 Kotlin 允许在接口(interface)中编写代码,并且可以在一个类中实现多个接口(interface),那这不是又一次制造了“菱形继承(钻石问题)”吗?

最佳答案

方案 1

两个接口(interface)具有相同签名的方法,并且在接口(interface)中都没有实现,则需要实现具有相同签名的方法单个方法。

例子

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)有相同签名的方法,不同的返回类型在这种情况下会出错

例子
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 中不允许的类的多重继承有关,尽管您可以通过实现具有两个接口(interface)的接口(interface)来创建菱形的场景,然后在 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
}
}

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

关于interface - "Code in Interfaces"Kotlin,他们如何避免 "deadly diamond of death"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46905026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com