2
votes

Constructeur secondaire de classe abstraite Kotlin

Je ne peux pas créer le constructeur secondaire pour cette classe abstraite.

@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


0 commentaires

3 Réponses :


3
votes

Lorsque vous créez un constructeur secondaire et qu'une classe a un constructeur primaire non vide, vous devez transmettre tous les paramètres du constructeur primaire , par exemple:

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) { ... }

Dans votre cas, cela peut être le suivant:

@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)
}

Ou vous pouvez créer un constructeur principal avec les paramètres par défaut:

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
}


0 commentaires

9
votes

Vous pouvez appeler le constructeur secondaire comme ceci -

@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 commentaires

0
votes

La raison pour laquelle vous obtenez un cycle dans l'erreur de chaîne d'appels de délégation , est que

BaseAndroidViewModel(application: Application): AndroidViewModel(application)

Est l'équivalent de java:

constructor(application: Application): super(application)

Ceci dit que vous appelez votre constructeur de manière récursive.


Comme indiqué dans Réponse d'Alok Mishra , vous devriez plutôt appeler le super constructeur.

public MyClass(Application application){
    this(application)
}

C'est en fait l'équivalent de votre constructeur principal:

constructor(application: Application): this(application)

Vous pouvez constater qu'il ne s'agit que d'un remplacement des mots clés constructor par BaseAndroidViewModel et super par AndroidViewModel


0 commentaires