Классы, которые я использую, являются более сложными, чем этот, но я думаю, что этот произвольный пример будет работать так же хорошо. Допустим, у меня есть базовый абстрактный класс, который всегда хочет умножить одного из его членов 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()
на init? Это неправильно, потому что работа с foo будет выполняться только один раз.