【问题标题】:Inheritance in KotlinKotlin 中的继承
【发布时间】:2016-11-13 16:54:10
【问题描述】:

最近几天试图用 Kotlin 弄清楚,阅读了文档并找到了一个示例。在底部article:

interface A {
    fun foo() { print("A") }
    fun bar()
}

interface B {
    fun foo() { print("B") }
    fun bar() { print("bar") }
}

class C : A {
    override fun bar() { print("bar") }
}

class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }
}

现在,如果我们从 A 派生一个具体的类 C,显然我们必须重写 bar() 并提供一个实现。如果我们从 A 和 B 派生 D,我们不必重写 bar(),因为我们只继承了它的一个实现。

我已经尝试过这样做,但是 IDE 强调我必须从 A 类中重写 bar() 函数,因为 D 类继承了 bar() 的多个接口方法

更新:Kotlin issue-tracker.

【问题讨论】:

  • 你在问什么问题?
  • @AndrewOrobator,是文章中的错误还是我做错了什么?
  • 文章好像有错误。请参阅下面的答案
  • @AndrewOrobator,我看到了,谢谢回答,希望其他开发者能看到
  • 您应该将此作为问题提交到kotl.in/issue,因为编译器不同意官方文档。而且由于您无法与编译器抗争(而且更改速度会更慢),因此最好找出必须以团队可以跟踪或采取行动的方式更改哪个编译器。显然这里有一个需要解决的冲突。

标签: oop inheritance kotlin


【解决方案1】:

文章似乎有错误。因为D 继承自A 和B,这两个接口都有bar() 方法,所以必须定义这两个实现。

【讨论】:

  • 没办法。在 Kotlin 中,接口中的方法的行为应该与 Java8 中的默认方法相同。没有任何文档另有说明。我认为这是一个编译器错误,但有人会从 Kotlin 团队中得知。
猜你喜欢
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多