переменные не обновляются после наследования от подкласса - PullRequest
0 голосов
/ 16 февраля 2020

Допустим, я работаю над следующим кодом в 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 возвращается при инициализации, но не обновляется, если в отдельные детали внесены изменения ? Правильно ли мое форматирование для использования этих подклассов? Я нашел некоторую документацию о правильном использовании подкласса, но я еще не нашел структуру, которая соответствует случаю использования, который у меня есть. Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 16 февраля 2020

Ваша переменная высоты имеет вспомогательное поле, которое будет инициализировано значением после знака =. Он не будет пересчитан при получении. Таким образом, этот код 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.

0 голосов
/ 16 февраля 2020

Вы не используете геттер, вы просто вычисляете и присваиваете значение height, когда инициализируется Human.

Вам нужна реализация геттера:

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