Scala создать общий val для двух классов с одним и тем же родителем - PullRequest
1 голос
/ 07 мая 2020

У меня есть два класса, которые расширяют одну и ту же черту:

trait Event {
  val propertyCommon : String = ""
}

case class EventA(propertyA : String) extends Event
case class EventB(propertyB : String) extends Event

Теперь я создаю экземпляры своих классов в списке:

myList : List[Event] = List(EventA("a"),EventB("b"))

Я хочу создать экземпляр после общее свойство, как если бы в моем трейте был метод копирования:

myList.map(_.copy(propertyCommon = "Something"))

Как я мог это сделать?

1 Ответ

3 голосов
/ 07 мая 2020

То, что вы говорите, что хотите сделать, называется шаблоном прототипа в OOP, и, насколько я могу судить, он не поддерживается из коробки в Scala (и, я думаю, где-нибудь еще).

Есть также несколько проблем:

  • propertyCommon не настроен с помощью конструктора, поэтому каждая реализация, которая должна его установить, скорее всего, должна будет override использовать анонимный класс (но тогда это свойство не будет частью equals, hashcode, toString, деривации и т.д. c)
  • Event не определяет какой-либо интерфейс, который позволил бы его обновить

Самый простой (и самый безопасный) способ реализовать нужную вам функциональность был бы примерно так:

trait Event {
  val propertyCommon: String // will be set by implementing class

  def clone(propertyCommon: String = this.propertyCommon): Event
}

// children define propertyCommon to match the interface
case class EventA(propertyA: String, propertyCommon: String = "") extends Event {
  def clone(propertyCommon: String = this.propertyCommon): EventA = copy(propertyCommon)
}
case class EventB(propertyB: String, propertyCommon: String = "") extends Event {
  def clone(propertyCommon: String = this.propertyCommon): EventB = copy(propertyCommon)
}

Однако, возможно, если бы мы знали больше о вашей проблеме, мы могли бы предоставить некоторые другое, более простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...