如何在 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#,但如果我正确理解 virtual
和 protected
关键字,那么您似乎想要一个可以从外部读取的可覆盖 属性 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
有没有办法像在 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#,但如果我正确理解 virtual
和 protected
关键字,那么您似乎想要一个可以从外部读取的可覆盖 属性 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