【问题标题】:How to specify proper override explicitly in kotlin如何在 kotlin 中明确指定正确的覆盖
【发布时间】:2021-01-10 02:31:06
【问题描述】:

我有一个这样的 java 类:

class A {
    public void foo() {...}
}

然后在 Kotlin 中,一个类:

class B: A() {}

我是从 B 扩展而来,但使用一个带委托的接口来覆盖 A.foo,即

interface IFoo {
    fun foo()
}

class FooImpl: IFoo {
    override fun foo() { ... }
}

这就是问题所在,我用它作为

class C: B(), IFoo by FooImpl() {}

但我收到了foo() hides supertype override... please specify proper override explicitly 的错误。我在哪里做这个?

【问题讨论】:

  • Kotlin 不支持使用它的类的委托覆盖函数。委托完全不知道使用它的类。即使使用它的类重写了它的方法之一,如果委托的方法之一调用了被重写的方法,它也会调用它自己的实现,而不是重写。
  • 我得到了这个工作:pl.kotl.in/vqT-4G9mG - 同样的事情,但基类是 kotlin 的(我在那里做了什么不同的事情吗?)
  • 哦,也许它适用于 Kotlin 基类。我没试过。

标签: class kotlin inheritance overriding delegation


【解决方案1】:

假设你不允许修改 Java 类,最好使用组合

 class A {
    fun foo() {
        println("A")
    }
}

open class B (val a:A): IFoo {
    override fun foo(){
        a.foo()
    }
}

interface IFoo {
    fun foo()
}

class FooImpl: IFoo {
    override fun foo() { println("B") }
}
class C(): IFoo by B(A()) {} // A
//class C(): IFoo by FooImpl() {} // B

fun main(){
    val c = C()
    c.foo()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2012-05-30
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多