【问题标题】:Use an abstract value in a superclass constructor in Kotlin在 Kotlin 的超类构造函数中使用抽象值
【发布时间】:2020-11-27 15:51:16
【问题描述】:

我在 Kotlin 中有一个抽象类,它有一个抽象字段:

abstract val maxSemitoneDistance: Float

我有两个类从这个抽象类扩展并覆盖这个值,定义它,例如:

override val maxSemitoneDistance = 1f

我需要在父类的构造函数上使用这个值,这应该没问题,因为在运行时它将由子类定义。但是当我尝试使用它时,该值始终为0!这里发生了什么?我尝试将其更改为抽象方法并以相同的效果实现它,得到 0 而不是真正的覆盖值。

【问题讨论】:

  • 不要将其设为abstract,而是将其放在主构造函数中。

标签: oop kotlin inheritance abstract-class


【解决方案1】:

我需要在父类的构造函数上使用这个值,这应该没问题,因为在运行时它将由子类定义。

它在子类的构造函数中初始化,它只在父类的构造函数之后运行(这是有道理的,因为子类的字段可以依赖于父类的值)。

我尝试将其更改为抽象方法并以相同的效果实现它,得到 0 而不是真正的覆盖值。

这应该可以。假设你这样做

// superclass
abstract fun maxSemitoneDistance(): Float

// subclass
override fun maxSemitoneDistance() = 1f

应该如此

override val maxSemitoneDistance get() = 1f

但基本上,在构造函数中使用任何虚函数或属性时要非常小心,无论是否抽象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2018-09-16
    • 2011-03-21
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2022-01-20
    • 2014-08-09
    相关资源
    最近更新 更多