如何在使用traits时使我的handle方法具有多态性

时间:2016-12-22 21:04:21

标签: scala

我希望我的handle方法能够采用任何Animal类型,然后能够实际拥有特定类型,以便我可以继续处理。

我刚刚勾勒出我要找的东西:

dyld: Symbol not found: ...

如何设计我的域名,以便像上面那样工作?

1 个答案:

答案 0 :(得分:2)

你几乎按原样运作的代码。

模式匹配的语法需要包含一个变量名,如果你实际上使用了case类的属性,你可能会使用这个模式来提取它们。

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)
  }
}

一些注意事项:

  • 给定一个密封的特性,如果您的模式匹配不完整,编译器会发出警告(在您的情况下,您缺少对Owl的处理)。

  • 如果方法/函数的主体只是参数上的模式匹配,则可以跳过animal match