Я не могу создать вторичный конструктор для этого абстрактного класса.
@SuppressLint("StaticFieldLeak")
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: CreditsGetByIdUseCase,
private val videosGetByIdUseCase: VideosGetByIdUseCase,
private val reviewGetByIdUseCase: ReviewGetByIdUseCase,
private val addToFavoritesUseCase: AddToFavoritesUseCase,
private val getFavoriteByIdUseCase: GetFavoriteByIdUseCase
) : AndroidViewModel(application) {
constructor(application: Application) : this(application) // There a cycle in the delegation calls chain error
Вы можете вызвать вторичный конструктор, как это -
@SuppressLint("StaticFieldLeak") abstract class BaseAndroidViewModel : AndroidViewModel{
constructor(application: Application,
creditsGetByIdUseCase: CreditsGetByIdUseCase,
videosGetByIdUseCase: VideosGetByIdUseCase,
reviewGetByIdUseCase: ReviewGetByIdUseCase,
addToFavoritesUseCase: AddToFavoritesUseCase,
getFavoriteByIdUseCase: GetFavoriteByIdUseCase) : super(application)
constructor(application: Application) : super(application) }
Когда вы создаете вторичный конструктор, а класс имеет непустой первичный конструктор, вы должны передать все параметры, которые имеет первичный конструктор, например:
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: String,
private val videosGetByIdUseCase: String
) : AndroidViewModel(application) {
constructor(application: Application) : this(application,
"creditsGetByIdUseCase", "videosGetByIdUseCase") // here we pass other necessary parameters
}
В вашем случае это может быть следующим:
@SuppressLint("StaticFieldLeak")
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: CreditsGetByIdUseCase?,
private val videosGetByIdUseCase: VideosGetByIdUseCase?,
private val reviewGetByIdUseCase: ReviewGetByIdUseCase?,
private val addToFavoritesUseCase: AddToFavoritesUseCase?,
private val getFavoriteByIdUseCase: GetFavoriteByIdUseCase?
) : AndroidViewModel(application) {
constructor(application: Application) : this(application, null, null, null, null, null)
}
Или вы можете создать основной конструктор с параметрами по умолчанию:
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: CreditsGetByIdUseCase? = null,
private val videosGetByIdUseCase: VideosGetByIdUseCase? = null,
private val reviewGetByIdUseCase: ReviewGetByIdUseCase? = null ,
private val addToFavoritesUseCase: AddToFavoritesUseCase? = null,
private val getFavoriteByIdUseCase: GetFavoriteByIdUseCase? = null
) : AndroidViewModel(application) { ... }
Причина, по которой вы получаете cycle in the delegation calls chain error
, заключается в том, что
constructor(application: Application): this(application)
Является эквивалентом Java:
public MyClass(Application application){
this(application)
}
Это говорит о том, что вы вызываете свой конструктор рекурсивно.
Как указано в ответе Алока Мишры, вместо этого вам следует обратиться к супер-конструктору.
constructor(application: Application): super(application)
Это на самом деле эквивалент вашего основного конструктора:
BaseAndroidViewModel(application: Application): AndroidViewModel(application)
Вы можете предписывать, что это просто замена ключевых слов constructor
по BaseAndroidViewModel
и super
по AndroidViewModel