我有一个扩展了另一个类的类,但是在这个类中,我不想调用 super 构造函数。
我该如何解决?

这是我的代码的摘要

class SubarticlePagerAdapter(fragmentManager: FragmentManager, context: Context, var selectedArticleName: String) : ArticlePagerAdapter(fragmentManager, context) {

    var subarticleDao: ArticleDao
    var itemCount = 0

    init {
        ApplicationHelper().getApplication(context).appComponent.inject(this)
        subarticleDao = ApplicationHelper().getApplication(context).subarticleDaoSession.articleDao
        initBundles(context)
    }

    override fun initBundles(context: Context?) {
        }
    }

我的问题是,当调用此构造函数时,首先运行父类构造函数,然后从那里调用initBundles(),但是那时未设置subarticleDao和selectedArticleName,并且出现异常。

最佳答案

TL; DR
我建议您将代码从init块移至initBundles函数,并在初始化后在其中使用变量。这样就无需避免调用父类(super class)构造函数。
广泛的答案
我认为您应该考虑要对设计进行的处理。围绕一种语言习语并不是一个好主意,也不是一个好的设计的标志-至少当Kotlin是您的语言时:)
您对代码所做的操作(从父类(super class)中重写(可能是抽象方法),initBundles几乎就是template method pattern。因此,在我看来,initBundles的目的是让子类自定义初始化的一部分...本质上是什么您在init块中执行。
编辑:正如保罗在评论中指出的那样,您不能在基础类初始化完成之前使用成员selectedArticleName。因此,如果基类在初始化期间调用initBundles,则子类中的属性将不会像Paul's link所述那样被初始化。
由于在代码段中您没有使用selectedArticleName,因此您可以将初始化内容移至initBundles函数,然后在其中初始化subarticleDao
但是,如果此时需要使用子类属性,我真的建议您重新考虑设计。应该有几种方法可以解决此问题,但是要确定最适合您的要求的方法,则需要进一步了解您的设计意图。

07-24 20:11