当使用性状时,如何使我的手柄方法多态



我希望我的手柄方法能够采用任何动物类型,然后能够实际具有特定类型,以便我可以继续处理。

我只是勾勒出我在寻找的内容:

sealed trait Animal
case class Dog(id: Int) extends Animal
case class Cat(id: Int) extends Animal
case class Owl(id: Int) extends Animal

object AnimalHandler {
  def handle(animal: Animal) = animal match {
    case Dog => processDog(dog)
    case Cat => processCat(cat)
  } 
}

我如何设计自己的域才能像以上一样工作?

您的代码非常有效。

模式匹配中的语法将需要包含一个变量名称,如果您实际使用案例类的属性,则可能会使用模式提取它们。

sealed trait Animal
case class Dog(id: Int) extends Animal
case class Cat(id: Int) extends Animal
case class Owl(id: Int) extends Animal
def processDog(dog: Dog) = println(s"woof ${dog.id}")
def processCat(id: Int) = println(s"meow $id")
def processOwl(owl: Owl, id: Int) = println(s"hoot ${owl.id}")
object AnimalHandler {
  def handle(animal: Animal) = {
    case dog: Dog => processDog(dog)
    case Cat(id) => processCat(id)
    case owl @ Owl(id) => processOwl(owl, id)
  }
}

一些笔记:

  • 给出了密封的特征,如果您的图案匹配不完整,则编译器会警告您

  • 如果方法/功能的正文不过是参数上的模式匹配,则可以跳过animal match

最新更新