デザインパターンではないような気もするけど、Scala Wikiに載っていたのでやってみる。
"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)
オブジェクトがなにを出来るかはオブジェクト自身が知っているというパターン(?)
Scalaの場合、
def function(hoge {def piyo: Some})
という風に記述するとpiyo: Someという関数を持つオブジェクトをfunctionは引数に取れる。
この際trait等は使わなくてよい。
一致する関数を持たない場合はコンパイルエラーとなる。
実行時にはリフレクションを使って呼び出される。
class アヒル {
def ガー = println("ガー")
}class ダックスフント {
def ワン = println("ワン")
}class まねきねこダック {
def ガー = println("ねことアヒルが力をあわせて(略)")
}object Main {
def さあ鳴けアヒルちゃん(アヒル: {def ガー}) {
アヒル ガー
}def main(args: Array[String]) = {
さあ鳴けアヒルちゃん(new アヒル)
// さあ鳴けアヒルちゃん(new ダックスフント) これは『ガー』を持たないのでコンパイルエラー
さあ鳴けアヒルちゃん(new まねきねこダック)
}
}