如何在 Kotlin 中翻译在 C# 中声明为虚拟的方法?

How can I translate a method declared virtual in C # in Kotlin?

有没有办法像在 C# 中那样在 Kotlin 中的抽象 class 中声明虚拟方法和虚拟属性?

C# 示例:

public abstract class myAbstractClass {

private string _myString = "";

        protected virtual string MyString
        {
            get { return _myString ; }
            set { _myString = value; }
        }


public virtual string getMyString(){
   return _myString
}


}

我不熟悉 C#,但如果我正确理解 virtualprotected 关键字,那么您似乎想要一个可以从外部读取的可覆盖 属性 class 但只能从 class 或子 class 中设置。如果是这样,那么我相信等效的 Kotlin 代码将是:

abstract class MyAbstractClass {

    open var myString = ""
        protected set
}

但如果您真的需要这两个属性和函数,那么等效项将是:

abstract class MyAbstractClass {

    private var _myString = ""
    protected open var myString by ::_myString

    open fun getMyStringAlt() = _myString
}

不幸的是,至少在 JVM 上,getMyStringAlt() 函数不能命名为 getMyString(),因为它与 myString 属性 的 getter 冲突.我不确定是否有解决方法。

等效代码为:

abstract class MyAbstractClass {
    protected open var myString = "foo"
    open fun customGetString() = myString
}

这给了你一个可以被子类覆盖的myString 属性,一个可以被子类覆盖的customGetString函数。但如果他们不覆盖它,他们就会得到默认行为。一些例子:

class ConcreteClassA : MyAbstractClass()

class ConcreteClassB : MyAbstractClass() {
    override var myString = "bar"
}

class ConcreteClassC : MyAbstractClass() {
    override fun customGetString() = myString + "extra"
}

class ConcreteClassD : MyAbstractClass() {
    override var myString = "baz"
    override fun customGetString() = myString + "extra"
}

fun main() {
    println(ConcreteClassA().customGetString())
    println(ConcreteClassB().customGetString())
    println(ConcreteClassC().customGetString())
    println(ConcreteClassD().customGetString())
}

输出

foo
bar
fooextra
bazextra