2016-12-22 7 views
0

ハンドルメソッドで任意のAnimal型を取得し、実際に処理できるように特定の型を持つことができるようにします。形質を使用するときにハンドルメソッドを多態性にする方法

私はちょうど私が探しています何のスケッチ:

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) 

    } 
} 

どのように私は上記のように動作するように自分のドメインを設計することができますか?

答えて

2

あなたのコードはそのままの状態で動作します。

パターンマッチの構文には変数名を含める必要があります。実際にケースクラスの属性を使用している場合は、それらを抽出するためにパターンを使用します。

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

いくつかの注意:

  • 密閉された形質を与え、あなたのパターンマッチは(あなたのケースでは、あなたがフクロウのためにハンドリング欠落していた)完全でない場合、コンパイラは警告を表示します。

  • 方法/機能の本体は引数のパターンマッチに他ならない場合は、Javaではanimal match

+0

をスキップすることができ、これは動作しますが、あなたは明示的にcase文にキャストしなければなりません実際のタイプを取得する権利はありますか? –

+0

JavaのSwitch/Case文ははるかに制限されています。 'x:Type'構文は、"このパターンはType型の単一の値で構成されています。これをxと呼んでいます "と言っています。代わりに、あなたが犬を渡した場合は、犬のIDを持つidという名前の値を取得する、パターンとして 'Dog(id)'のようなものを使うことができます。 –

+0

パターンマッチングを使用して値を抽出する方法のいくつかの例を追加しました.HTH –

関連する問題