В вашем коде две проблемы
Во-первых, ChildListFragment необходимо расширить AbstractListFragment , чтобы переопределить его поле
class ChildListFragment() : AbstractListFragment()
Второе,Вы не можете переопределить var с помощью подкласса типа свойства, потому что он нарушает Принцип подстановки Лискова . Если какой-то метод ожидает AbstractListFragment и вы передаете туда ChildListFragment , метод может назначить некоторого другого дочернего элемента AbstractListViewModel viewModel и ChildListFragment сломается, потому что для него требуется ровно ChildListFragment
class AnotherChild() : AbstractListFragment()
fun someMethod(AbstractListFragment fragment) {
fragment.viewModel = AnotherChild() // <= here ChildListFragment would expect ChildListViewModel but would get AnotherChild
}
fun main() {
someMethod(ChildListFragment())
}
Если вы хотите вернуть ChildListViewModel из ChildListFragment , вам следует изменить viewModel в значении val
abstract class AbstractListFragment() {
abstract val viewModel : AbstractListViewModel
}
class ChildListFragment() : AbstractListFragment() {
override val viewModel : ChildListViewModel
}
Вы можете использовать поле запекания lateinit, как показано ниже:
class ChildListFragment() : AbstractListFragment() {
private lateinit var _viewModel: ChildListViewModel
override val viewModel : ChildListViewModel by lazy {
_viewModel
}
}
Или вы можете использовать другие методы, такие как MVP (см. Библиотека Moxy *, например, 1040 *).