Kotlin абстрактный класс вторичный конструктор - PullRequest
0 голосов
/ 08 января 2019

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

@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's a cycle in the delegation calls chain error

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Вы можете вызвать вторичный конструктор так -

@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) }
0 голосов
/ 08 января 2019

Причина, по которой вы получаете 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

0 голосов
/ 08 января 2019

Когда вы создаете вторичный конструктор и класс имеет непустой первичный конструктор, вы должны передать все параметры, которые первичный конструктор имеет, например:

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) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...