Как заставить класс данных (Kotlin) расширяться из суперкласса и наследовать одно из полей суперкласса? - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь создать собственный метод toString () для некоторых моих классов данных. Но я бы хотел определить переопределение fun toString только один раз.

Это был бы мой суперкласс:

abstract class Id(val value: String) {
   override fun toString(): String {
       return value
   }
}

Теперь я хочу использовать настроенный метод toString () в некоторых моих классах данных, расширяя идентификатор суперкласса:

data class MyId(val v: String): Id(v)

однако, это введет вторичное поле и геттер для «v» в MyId, а это не то, что я хочу. Использование «значения» вместо «v» вызывает у меня проблему: «значение» скрывает член супертипа «Id». Я хотел бы повторно использовать поле «значение» и получатель, определенные в Id. Я не хочу вводить новый.

Как я могу это исправить?

Ответы [ 3 ]

4 голосов
/ 14 июня 2019

Я не совсем уверен, что вы пытаетесь сделать, но вы можете сделать это

abstract class Id(open val value: String) {
    override fun toString(): String {
        return value
    }
}

data class MyId(override val value: String): Id(value)
1 голос
/ 14 июня 2019

Обратите внимание, что для не data классов вы можете просто удалить val вместо переопределения:

class MyId(value: String): Id(value)

Это также не требует value в Id, чтобы быть open.

Это недопустимо, когда MyId является классом данных, поскольку все его параметры конструктора должны быть val или var.

0 голосов
/ 23 июня 2019

В моем вопросе я хотел переопределить метод toString () класса данных, добавив суперкласс.

Это невозможно.Франческ, его решение не будет переопределять метод toString () класса данных.Сгенерированный метод toString класса данных по-прежнему будет использоваться.

рассмотреть:

  val myId = MyId("a string value")
  assertThat(myId.toString()).isEqualTo("MyId\"a string value\")")
  assertThat(myId.toString()).isNotEqualTo("a string value")

Единственный способ изменить метод .toString() класса данных, это сам класс данных:

data class MyId(val value: String) {
  override fun toString() = value
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...