android - Kotlin 不调用 super

标签 android inheritance kotlin

我有一个类扩展了另一个类,但在这个类中我不想调用 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/

相关文章:

java - 谷歌地图自定义标记android

android - recyclerview 没有连接适配器;跳过布局

c# - 如何扩展基类功能

实例属性的 Python NotImplementedError

kotlin - 如何使用带左方差注释的 flatMap vavr Either

java - 将一个组组合成多个组而不重复

arrays - Kotlin 数组中的 indexOf

android - Kotlin - 为什么这个变量在初始化后为空?

javascript - signinwithphonenumber 身份验证失败

typescript 声明 : Merge a class and an interface