Более общий метод копирования (класс case с extends) - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть следующая запечатанная черта:

sealed trait Move extends AbstractCommand {
  def execute(): Option[State] = {
      this match {
        case MoveLeft(state) => shiftCursorCharacter(-1, state)
        case MoveRight(state) => shiftCursorCharacter(1, state)
        case MoveUp(state) => shiftCursorLine(-1, state)
        case MoveDown(state) => shiftCursorLine(1, state)
      }
  }

  def copy(newState: State): Move = {
    this match {
      case MoveLeft(_) => MoveLeft(newState)
      case MoveRight(_) => MoveRight(newState)
      case MoveRightAndPast(_) => MoveRightAndPast(newState)
      case MoveUp(_) => MoveUp(newState)
    }
  }


case class MoveLeft(state: State) extends Move
case class MoveRight (state: State) extends Move
case class MoveRightAndPast (state: State) extends Move
case class MoveDown (state: State) extends Move
case class MoveUp (state: State) extends Move

И AbstractCommand выглядит следующим образом:

abstract trait AbstractCommand {
  val state: State
  def execute(): Option[State]
}

Конечно, у меня есть другие типы команд (расширение AbstractCommand) которые также имеют состояние и и execute def.Я довольно новичок в Скале.Я не могу использовать встроенный метод копирования для case-классов (не очень понимаю, почему).Мне было интересно, если есть

A) лучший (более общий) способ написания метода копирования, видимо, как будто я добавляю новые команды Move, все они имеют идентичное поведение копирования: Я хочу изменить состояние, но сохранить тип команды, или

B) есть лучший дизайн для включения этой идеи (я пробовал, но не смог найтиальтернативы).

...