Используйте абстрактное значение в конструкторе суперкласса в Kotlin - PullRequest
0 голосов
/ 07 августа 2020

У меня есть абстрактный класс в Kotlin, который имеет абстрактное поле:

abstract val maxSemitoneDistance: Float

, и у меня есть два класса, которые выходят из этого абстрактного класса и переопределяют это значение, определяя его, например:

override val maxSemitoneDistance = 1f

Мне нужно использовать это значение в конструкторе родительского класса, что должно быть нормально, так как во время выполнения оно будет определяться дочерними классами. Но когда я пытаюсь его использовать, значение всегда 0! Что здесь происходит? Я попытался изменить его на абстрактный метод и реализовать вместо этого с тем же эффектом, получив 0 вместо реального переопределенного значения.

1 Ответ

0 голосов
/ 08 августа 2020

Мне нужно использовать это значение в конструкторе родительского класса, что должно быть нормально, так как во время выполнения оно будет определено дочерними классами.

Оно инициализируется в конструктор дочернего класса, который запускается только после конструктора родительского класса (что имеет смысл, поскольку поля дочернего класса могут зависеть от значений из родительского класса).

Я попытался изменить его на абстрактный метод и реализовать вместо этого с тем же эффектом, получив 0 вместо реального переопределенного значения.

Однако это должно сработать. Предполагая, что вы делаете

// superclass
abstract fun maxSemitoneDistance(): Float

// subclass
override fun maxSemitoneDistance() = 1f

И так должно

override val maxSemitoneDistance get() = 1f

Но в целом будьте очень осторожны при использовании любых виртуальных функций или свойств в конструкторе, абстрактных или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...