【发布时间】:2019-10-29 01:54:33
【问题描述】:
我使用的类比这更复杂,但我认为这个任意示例也可以。假设我有一个基本抽象类,它总是想将它的一个 Int 成员 foo 乘以 2。它并不关心值是什么,只要它是一个 Int。另外,假设我们不关心这种乘法何时发生,只要它发生在构造函数时间附近。最后,不允许将 foo 作为构造函数参数传入。它需要是被子类覆盖的类成员。
abstract class ExampleClass {
abstract val foo: Int
init {
println("Here is foo times 2!: ${foo * 2}")
}
}
class ChildClass : ExampleClass() {
override val foo = 5
}
这显然行不通。父类首先被构造,因此在运行时会抛出错误,因为成员还没有被实例化。但是根据我的条件,我不介意 foo 的工作是否发生在子类被实例化之后。 父类有没有办法说“在我的孩子完成实例化后执行此操作”?还是我只需要妥协:
abstract class ExampleClass {
abstract val foo: Int
fun bar() {
println("Here is foo times 2!: ${foo * 2}")
}
}
class ChildClass : ExampleClass() {
override val foo = 5
init {
bar()
}
}
我所有的子类在初始化时都调用bar() 吗?这样做感觉不对,因为用 foo 完成的工作只会发生一次。
【问题讨论】:
标签: kotlin