我正在开发一个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中实现这样的东西的正确方法是什么?
答案 0 :(得分:4)
这里的Kotlin与Java或大多数其他OOP语言没什么不同。
只要你在方法的合同中明确表示压倒一切 方法不能访问子类中的任何状态,您可以安全地从基类的构造函数中调用它们。如果类违反此规则,则其方法将访问未初始化状态。