从子类继承后变量不更新

variables don't update after inheriting from subclass

假设我正在使用 Kotlin 编写以下代码:

class Human(var head: Head, var body: Body, var legs: Legs) {
   var height = this.head.length + this.body.length + this.legs.length
}

class Head(var length: Int) { }

class Body(var length: Int) { }

class Legs(var length: Int) { }

为什么在初始化时返回的高度 Human.height -> x 是正确的,但如果对各个部分进行更改则不会更新?我使用这些子类的格式是否正确?我找到了一些关于正确使用子类的文档,但我还没有找到与我的用例相匹配的结构。提前致谢!

您没有实施 getter,您只是在初始化 Human 时计算并分配 height 值。

您正在寻找的是 getter 实施:

class Human(var head: Head, var body: Body, var legs: Legs) {
    val height
      get() = this.head.length + this.body.length + this.legs.length
}

您的高度变量有一个支持字段,它将被初始化为 = 符号后的值。获取它时不会重新计算它。所以这段 Kotlin 代码将等同于以下 Java 代码:

// Kotlin
var height = this.head.length + this.body.length + this.legs.length

// Java
// The backing field
private int height = this.head.length + this.body.length + this.legs.length

public int getHeight() {
    return height;
}

public void setHeight(int height) {
    this.height = height;
}

您真正想要的是在每次调用 get 方法时重新计算该值。由于您不想实际写入任何 height 字段,因此可以使用 val 而不是 var。像这样:

// Kotlin
val height: Int
    get() = this.head.length + this.body.length + this.legs.length

// Which is equivalent to this Java code:
public int getHeight() {
    return this.head.length + this.body.length + this.legs.length;
}

如您所见,支持字段将消失,因为每次都会重新计算该值。也没有 setter,因为我们现在使用的是 val.