У меня есть следующая запечатанная черта:
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) есть лучший дизайн для включения этой идеи (я пробовал, но не смог найтиальтернативы).