我正在制作一个kotlin库,它相当于现有的python库。用另一种语言生成等同代码可能是一个挑战。
具体来说,我有一个基类构造函数方法,它使用了一个可以在基类中重写的值。
挑战在于子类中重写的val没有在基类构造函数之前应用的值。在python中,子类构造函数中的一些代码可以在调用基类构造函数之前执行,但在kotlin中,基类构造函数的所有代码都首先执行。
但请考虑这个kotlin代码:
open class Base{
val simple = 3
open val open = 3
open val openGet = 3
open val getter get()= 3
open val getOpen get()= 3
open val getDelg by GetDelg(3)
init {
println("base simple $simple open $open openG $openGet "+
"getOpen $getOpen getter $getter "+
" getDelg $getDelg")
}
//open fun add(a:Int,b:Int) = a + b
}
class SubClass:Base(){
override val open = 4
override val openGet get()= 4
override val getter get() = 4
override val getOpen = 4
//override val getDelg by GetDelg(4) //uncomment for null pointer
init {
println("sub simple $simple open $open openG $openGet "+
"getOpen $getOpen getter $getter "+
" getDelg $getDelg")
}
}
class GetDelg(val value:Int){
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
return value
}
}
基类init中的Open为0,因为尚未运行设置值的代码(不是3,因为super.open是单独的)。
openG,一个被get()方法覆盖的值,可能意外地返回两个init()方法中的覆盖值,所以对于很多情况这是一种可能的方法,但是在我试图解决的特定情况下不能工作
getOpen,由简单初始化覆盖的基础中的get()方法,表现为由新的初始化覆盖的简单初始化值,该初始化将在基本init()方法中进行整合
getter(),另一个get()方法覆盖的get()方法返回覆盖值,openG
getDelg()实际上在基本init()方法中调用时会生成空指针异常,因为尚未计算重写值
注意:我假设此行为的一部分基于以下事实:重写的属性实际上是新的不同属性,因此它们不会从基类属性继承值,这仍然可以通过super访问..这意味着,直观地反驳,在基础init()
方法中打开,返回0,而子类init()
中的super.open将返回3
所以问题是,我如何使用委托覆盖,但仍然在基类init中访问了覆盖委托?
我目前的想法是将基类中初始化的值移动到懒惰属性,但我想有其他想法。