在基础构造函数中使用的子类val

我正在生产一个相当于现有python库的kotlin库。 用另一种语言编写等同代码可能是一个挑战。

具体来说,我有一个基类构造方法的情况下,它使用一个值,可以在基类中重写。

面临的挑战是,在子类中的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,因为设置值的代码还没有运行(不是在super.open中是独立的)。

openG是一个get()方法重写的值,可能会意外地返回两个init()方法中的重写值,所以这对于很多情况来说是一个可能的方法,但是在我试图解决的特定情况下不起作用。

getOpen,一个被简单初始化重写的get()方法,表现为一个简单的初始化值,被一个新的初始化覆盖,这个初始化将在基本的init()方法中被单元化

getter(),另一个get()方法的get()方法返回覆盖值,就像openG一样

如果在基本init()方法中调用,getDelg()实际上会生成一个空指针exception,因为重写的值还没有被计算

注意:我认为这种行为的一部分是基于这样一个事实,即被重写的属性实际上是新的不同的属性,所以它们不会inheritance基类属性的值,这个属性仍然可以通过super来访问。这意味着,直觉地反驳, init()方法返回0,而子类init()中的super.open返回3

所以问题是,我怎么能重写使用委托,但仍然有覆盖委托访问在基类的init?

我目前的想法是将在基类中初始化的值移动到一个懒惰的属性,但我想有其他的想法。