从kotlin中的构造函数调用抽象方法是否安全?

时间:2018-04-10 11:20:12

标签: android kotlin android-custom-view

我正在开发一个Android项目。我想用抽象方法

创建FrameLayout的抽象子类
@LayoutRes    
abstract fun getLayoutToInflate(): Int

在构造函数中,我想要扩充此方法返回的布局。但IDE在此代码中显示有关“在构造函数中调用非最终函数...”的警告

val inflater = LayoutInflater.from(context)
inflatedBanner = inflater.inflate(getLayoutToInflate(), this, true)

此应用尚未构建。所以写了一个简单的kotlin代码来测试。

abstract class Base {
    val text: String
    constructor(text: String) {
        this.text = text
        println(text + getTextSuffix())
    }
    abstract fun getTextSuffix(): String
}

class Derived(text: String) : Base(text) {
    override fun getTextSuffix() = "_"
}

fun main(args: Array<String>) {
    val d = Derived("stuff")
}

此代码始终打印“stuff_”,这意味着重写的抽象方法在构造函数中可用。 我也可以在我的应用程序中依赖此行为吗?如果没有,在kotlin中实现这样的东西的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

这里的Kotlin与Java或大多数其他OOP语言没什么不同。

只要你在方法的合同中明确表示压倒一切 方法不能访问子类中的任何状态,您可以安全地从基类的构造函数中调用它们。如果类违反此规则,则其方法将访问未初始化状态。

相关问题