【问题标题】:using child methods in parent classes [duplicate]在父类中使用子方法[重复]
【发布时间】:2021-05-01 12:22:02
【问题描述】:

我有这 4 个类的(更复杂的)版本,问题是当我尝试初始化 Test() 时,android studio 告诉我 cannot call data.log() on a null object reference。为什么是这样?我该如何解决?

abstract class Test() {
    protected abstract val data: CustomClass
    init {
        data.log()
    }
}
class myClass(): Test() {
    override val data = Hello()
}
abstract class CustomClass() {
    function log() {
        Log.i("TEST", "HELLO");
    }
}
class Hello(): CustomClass() {
    
}

我有很多扩展 Test()Hello() 的类我不想在多个类中调用 data.log() 以避免重复代码

【问题讨论】:

    标签: kotlin generics


    【解决方案1】:

    尝试逐步评估您的代码:

    1. 调用 myClass() -> 从您的代码中调用的 myClass 构造函数
    2. 调用 Test() -> 从 myClass 构造函数调用的父构造函数
    3. 调用 Test 的 init -> 从 Test 构造函数调用的 init 部分
    4. NPE -> 数据字段尚未初始化

    如您所见,init 部分在数据初始化之前被调用。您的问题的解决方案非常简单,将数据字段直接移动到测试的构造函数中并删除抽象修饰符:

    abstract class Test(protected val data: CustomClass) {
        init {
            data.log()
        }
    }
    
    class myClass(): Test(Hello())
    

    P.S.:我希望这只是一个例子,你的类名不要以小写开头。 :)

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2021-01-14
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多