Scala 如何在继承树中模式匹配抽象父类

Scala 如何在继承树中模式匹配抽象父类,scala,pattern-matching,case-class,Scala,Pattern Matching,Case Class,我刚接触scala,有java背景 在类继承树中,有没有一种模式匹配超类(或特征)的方法,将叶子作为案例类和节点抽象类或特征?据我所知,案例类继承是不允许的 我认为模式匹配大型继承树中的抽象类将非常有用 在下面的代码中,match语句中的最后一种情况是编译期间出现错误 一个人{ 定义名称:字符串 } 案例类客户(姓名:String,电子邮件:String)扩展个人 员工延伸到个人{ 定义id:Int } 案例类Worker(名称:String,id:Int,skills:Array[Strin

我刚接触scala,有java背景

在类继承树中,有没有一种模式匹配超类(或特征)的方法,将叶子作为案例类和节点抽象类或特征?据我所知,案例类继承是不允许的

我认为模式匹配大型继承树中的抽象类将非常有用

在下面的代码中,match语句中的最后一种情况是编译期间出现错误

一个人{
定义名称:字符串
}
案例类客户(姓名:String,电子邮件:String)扩展个人
员工延伸到个人{
定义id:Int
}
案例类Worker(名称:String,id:Int,skills:Array[String])扩展了Employee
案例类管理器(名称:String,id:Int,标题:String)扩展了Employee
def流程(p:人员)=p匹配{
案例客户(u,电子邮件)=>电子邮件
案例员工(姓名)=>name+“@acme.com”
}
它没有那么花哨(其他人可能会建议使用结构类型),但它非常实用,我认为:

def process(p: Person) = p match {
   case Customer(_, email) => email
   case e: Employee => e.name + "@acme.com"
}
如果您需要匹配某些特定的已知值,您可以使用防护装置:

def process(p: Person) = p match {
   case Customer(_, email) => email
   case e: Employee if e.name == "Joe" => e.name + "@acme.com"
}

您在
Employee
中缺少
name
字段,在
Employee
的伴生对象中缺少
unapply
方法:

sealed trait Employee extends Person {
  def id: Int
  def name: String
}

object Employee {
  def unapply(e: Employee): Option[(String, Int)] =
    Option(e) map { e =>
      (e.name, e.id)
    }
}
通过上述更改,工艺方法不会出现任何问题:

def process(p: Person) = p match {
  case Customer(_, email) => email
  case Employee(name, _) => name + "@acme.com"
}

嗨,谢谢你的回复。你的代码解决了电子邮件的问题,但我正在寻找一个通用的方法。基本上,我想以与case类类似的方式进行模式匹配。这与case类非常接近。但是,当我将'name'设置为常量值时,模式匹配不起作用(例如:case Employee(“John”,41;)=>”john@bar.com"). 我的unapply方法可以支持这种过滤吗?它应该已经可以工作了。对我来说,它实际上是:
println(进程(Worker(“Erik”,2,Array.empty))
我在
进程中有这样一个例子:
案例员工(“Erik”,2,Array.empty)=>”erik@acme.com“