我有一个类扩展了另一个类,但在这个类中我不想调用 super 构造函数。 怎么解决呢?
这是我的代码 fragment
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
block 移动到 initBundles
函数,并在初始化后使用您的变量。那么就没有必要避免调用父类(super class)构造函数。
广泛的答案
我认为你应该考虑一下你想用你的设计做什么。围绕一种语言的习语进行工作通常并不是一个好主意或良好设计的标志 - 至少当 kotlin 是您的语言时:)
你对代码所做的事情(重写一个可能是抽象的方法,你的父类(super class)中的 initBundles
几乎就是 template method pattern 。所以在我看来 initBundles< 的目的
是让子类自定义部分初始化...基本上就是您在 init block 中所做的事情。
编辑:正如 Paul 在评论中指出的那样,在基类初始化完成之前,您不能使用成员 selectedArticleName
。因此,如果基类在初始化期间调用 initBundles
,则子类中的属性将不会被初始化,如 Paul's link 中所述。 .
由于在代码 fragment 中您不使用 selectedArticleName
,因此您只需将初始化内容移至 initBundles
函数并初始化您的 subarticleDao
那里。
但是,如果您需要此时使用子类属性,我真的建议您重新考虑您的设计。应该有多种方法可以解决这个问题,但要确定哪种方法最适合您的要求,需要进一步深入了解您的设计 Intent 。
关于android - Kotlin 不调用 super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51045350/