1
case class Message(xml : Node) {
  def toXML : Node = xml
}

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

这会导致属性命名冲突,因为 Scala 尝试在 ReqValidationMessage 案例类中创建名为 xml 的第二个属性。但我希望两个构造函数(Message 和 ReqValidationMessage)具有相同的参数。我应该怎么办?

4

3 回答 3

9

简短的回答是:您不应该扩展案例类——案例类继承现在已被弃用。

于 2011-10-12T15:00:31.540 回答
8

与其子类化案例类,不如使用 mixins 来复制通用特性:

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 )
于 2011-10-12T15:05:58.597 回答
0

If you want to stick with the scheme you presented, then you can just change the name of argument in second constructor - to something like xml2. Then you will have no naming conflict, and everything will work.

于 2011-10-12T15:23:22.187 回答