我是具有 Java 背景的 Scala 新手。
有没有办法在类继承树中模式匹配父类(super class)(或特征),叶子作为案例类,节点抽象类或特征?据我所知,案例类继承是不允许的。
我认为在大型继承树中匹配抽象类的模式会很有帮助
在下面的代码中,最后一种情况在编译期间匹配语句错误
sealed trait Person {
def name: String
}
case class Customer(name: String, email: String) extends Person
sealed trait Employee extends Person {
def id: Int
}
case class Worker(name: String, id: Int, skills: Array[String]) extends Employee
case class Manager(name: String, id: Int, title: String) extends Employee
def process(p: Person) = p match {
case Customer(_, email) => email
case Employee(name, _) => name + "@acme.com"
}
最佳答案
您错过了 name
字段在 Employee
和一个 unapply
Employee
的伴随对象中的方法:
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"
}
关于scala - 如何模式匹配继承树中的抽象父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802330/