属性获取器在Supertype上键入,而不是在Kotlin中实现

Ste*_*nke 5 kotlin

假设我有两个类,a Base和a Impl扩展Base.

package mypackage

open class Base
class Impl : Base()
Run Code Online (Sandbox Code Playgroud)

我如何为具体的Impl-Type(供内部使用)创建私有属性,使用类型为Base-Type公共getter来实现多态?我最初的方法是这样的:

class Test {
    private val myType = Impl()
        get():Base
}
Run Code Online (Sandbox Code Playgroud)

但是,Kotlin编译器抱怨:

错误:(30,11)Kotlin:Getter返回类型必须等于属性的类型,即'mypackage.Impl'

基本上,这就是普通Java中的样子:

public class Test {
    private Impl myImpl = new Impl();

    public Base getBase() {
        return myImpl;
    }
}
Run Code Online (Sandbox Code Playgroud)

怎么能实现这个目标?我错过了什么吗?

PS我知道Backing Fields和创建自定义方法作为getter的解决方法,我只是好奇如何以优雅的Kotlin方式处理它.

Kir*_*man 6

如果财产是私人的,那么吸气剂也是如此.在这种情况下,它将具有什么类型并不重要.如果您想拥有基本类型的公共属性,则需要单独声明它:

private val _myType = Impl()

public val myType : Base
    get() = _myType
Run Code Online (Sandbox Code Playgroud)