Переопределить методы из черт в случае объектов - PullRequest
1 голос
/ 24 апреля 2020

У меня есть черта и два тематических объекта. Оба объекта case имеют почти идентичный метод, который использует один уникальный метод из объекта case. Я хочу извлечь идентичный метод и поместить его в черту. Я не уверен, как это сделать с уникальными методами, которые он принимает в качестве аргументов. Пример кода:

sealed trait Book {}

case object Page extends Book {
def a(): UniqueToPage = println("Page")
def shared(contents: String) = println(s"Something shared and ${a()} and $contents") 
}

case object Cover extends Book {
def b(): UniqueToCover = println("Cover")
def shared(contents: String) = println(s"Something shared and ${b()} and $contents")
}

Мне кажется, что, возможно, я могу что-то сделать с преобразованием типов, но я не знаю, с чего начать. Любые предложения будут ценны. Обратите внимание, что дизайн является частью более крупного проекта, и я пытаюсь реорганизовать эту конкретную c часть.

1 Ответ

3 голосов
/ 24 апреля 2020

Если методы a() и b() возвращают разные типы UniqueToPage и UniqueToCover, попробуйте ввести тип члена

sealed trait Book {
  type T
  def c(): T
  def shared(contents: String) = println(s"Something shared and ${c()} and $contents")
}

case object Page extends Book {
  override type T = UniqueToPage
  override def c(): T = println("Page")
}

case object Cover extends Book {
  override type T = UniqueToCover
  override def c(): T = println("Cover")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...