Вместо подклассов классов дел, почему бы не использовать миксины для репликации общих функций:
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 )