【问题标题】:Kotlin abstract class secondary constructorKotlin 抽象类二级构造函数
【发布时间】:2019-06-02 21:31:36
【问题描述】:

我无法为这个抽象类创建辅助构造函数。

@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

【问题讨论】:

    标签: android kotlin constructor class-constructors


    【解决方案1】:

    当你创建一个 secondary 构造函数,并且一个类有非空的 primary 构造函数时,你应该传递 primary 构造函数具有的所有参数,例如:

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

    或者您可以使用默认参数创建 primary 构造函数:

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

    【讨论】:

      【解决方案2】:

      你可以像这样调用二级构造函数-

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

      【讨论】:

        【解决方案3】:

        您收到cycle in the delegation calls chain error 的原因是因为

        constructor(application: Application): this(application)
        

        相当于java:

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

        这表示你正在递归调用你的构造函数。


        Alok Mishra's answer 所述,您应该改为调用超级构造函数。

        constructor(application: Application): super(application)
        

        这实际上相当于你的主构造函数:

        BaseAndroidViewModel(application: Application): AndroidViewModel(application)
        

        您可以声明这只是将关键字 constructor 替换为 BaseAndroidViewModelsuper 替换为 AndroidViewModel

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 2020-11-27
          • 2022-01-20
          相关资源
          最近更新 更多