Запечатанный класс с существующими классами? - PullRequest
0 голосов
/ 09 апреля 2020

Я реализую пользовательскую клавиатуру и представляю клавиши 0-9 и десятичный разделитель как объекты Button. Затем у меня есть один последний ключ, который является клавишей возврата и представлен в виде ImageButton.

Когда я обрабатываю события щелчка, я знаю, что если пользователь нажал кнопку, он добавляет элемент в текстовое поле, и если они щелкнули по кнопке ImageButton и удаляют последний элемент из текстового поля.

Поскольку на клавиатуре есть только два возможных типа кнопок, я хотел реализовать эту логику c с блоком when без использования ветви else. Является ли это возможным? Глядя на запечатанную документацию класса, я не думаю, что это может быть, но просто прошу убедиться.

Я хотел бы сделать что-то вроде этого:

sealed class KeyboardButton {
  class Button
  class ImageButton
}

fun handleKeyPress(button: View) {
  when(button) {
    is KeyboardButton.Button -> // append element to text
    is KeyboardButton.ImageButton -> // remove last element from text
  }
}

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Вы можете обернуть существующие типы следующим образом:

sealed class KeyboardButton {
  class KButton(val x: Button)
  class KImageButton(val x: ImageButton)
}

fun handleKeyPress(button: KeyboardButton) {
  when(button) {
    is KeyboardButton.KButton -> // use button.x to access the underlying Button
    is KeyboardButton.KImageButton -> // similarly use button.x
  }
}
0 голосов
/ 09 апреля 2020

Вы не можете сделать это с запечатанным классом, потому что вы не можете получить представления, унаследованные от вашего запечатанного класса. Вы можете использовать ветку else, которая выдает исключение:

fun handleKeyPress(button: View) {
  when(button) {
    is Button -> // append element to text
    is ImageButton -> // remove last element from text
    else -> error("unsupported view type")
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...