从子类继承后变量不更新
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
.
假设我正在使用 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
.