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

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

これにより、ScalaがReqValidationMessageケースクラスにxmlという名前の2番目のプロパティを作成しようとするため、プロパティの名前が競合します。しかし、(MessageとReqValidationMessageの)両方のコンストラクターに同じ引数を持たせたいです。私は何をすべきか?

4

3 に答える 3

9

簡単に言えば、ケース クラスを拡張するべきではありません。ケース クラスの継承は非推奨になりました。

于 2011-10-12T15:00:31.540 に答える
8

ケースクラスをサブクラス化する代わりに、ミックスインを使用して共通の機能を複製してみませんか?

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

提示したスキームに固執したい場合は、2 番目のコンストラクターの引数の名前を xml2 のような名前に変更するだけです。そうすれば、名前の競合がなくなり、すべてが機能します。

于 2011-10-12T15:23:22.187 に答える