如何解决如何在 Kotlin 中翻译在 C# 中声明为 virtual 的方法?
有没有办法在 Kotlin 中的抽象类中像在 c# 中一样声明虚方法和虚属性?
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#,但如果我正确理解 virtual
和 protected
关键字,那么您似乎想要一个可以从类外部读取但只能设置的可覆盖属性从类内部或子类。如果是这样,那么我相信等效的 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。