从子类继承后变量不更新



假设我正在 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返回正确的高度,但如果对各个部分进行更改,则不会更新?我使用这些子类的格式是否正确?我已经找到了一些关于正确使用子类的文档,但我还没有找到与我的用例相匹配的结构。提前感谢!

您的高度变量有一个支持字段,该字段将初始化为=符号后面的值。当您获取它时,它不会重新计算。所以这个 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;
}

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

你不是在实现一个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
}

最新更新