Как расширить класс case, если предполагается, что производный класс имеет тот же параметр и не должен переопределять? - PullRequest
1 голос
/ 12 октября 2011
case class Message(xml : Node) {
  def toXML : Node = xml
}

case class ReqValidationMessage (xml : Node) extends Message(xml){
  // ...
}

Это приводит к конфликту именования свойств, поскольку Scala пытается создать второе свойство с именем xml в классе дел ReqValidationMessage.Но я хочу, чтобы оба конструктора (Message и ReqValidationMessage) имели одинаковые аргументы.Что мне делать?

Ответы [ 3 ]

9 голосов
/ 12 октября 2011

Краткий ответ: не следует расширять класс case - теперь наследование класса case устарело.

8 голосов
/ 12 октября 2011

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

trait XMLConvertible {
  def xml: Node
  def toXML = xml
}

case class Message(xml : Node) extends XMLConvertible

case class ReqValidationMessage(xml : Node) extends XMLConvertible {
  //...
}

Тогда, если вы хотите напрямую использовать XMLConvertible для сопоставления с образцом, добавьте объект-компаньон:

object XMLConvertible {
   def unapply( xc: XMLConvertible ) = Some( xc.xml )
}

Что позволяет написать:

case XMLConvertible(xml) => println( xml )
0 голосов
/ 12 октября 2011

Если вы хотите придерживаться схемы, которую вы представили, то вы можете просто изменить имя аргумента во втором конструкторе - на что-то вроде xml2.Тогда у вас не будет конфликта имен, и все будет работать.

...