前も同じようなタイトルで書きましたが、

多重ディスパッチ
http://d.hatena.ne.jp/nishiohirokazu/20080304/1204604699 にあった内容。

スクリプト言語でプログラミングするようになってから、 この手の、「あれ?これ出来なかったんだっけぇ?!」 というシチュエーションが良くある。

記事内のオーバーロードしたメソッドが 実行時の型によって選ばれないという件。

昔は気にならなかったのは、多分できないのが、 当たり前だという脳回路が出来上がっていたんだと思う。

普通は感じる事ができないし、出来ないからこそ 恐ろしい「思考停止」という状態を 過去の自分に感じる事ができた。

これは貴重な体験だ。

それは置いておいて、

記事内の現象自体は、Javaはインタフェースに対して メッセージングをするという概念で考えれば、 納得できるが、それでは、やはり思考停止だと思い、 今の自分だったらどう実装するだとうという観点で 考えてみた。

Java的には、 Animalにenterメソッドをつける方法が一番 エレガントな気がするけど、 やりたい事がシンプルに書けてない感じが残る

(この感じがスクリプト言語から得た感覚なのかも。。)

結局今の自分なら以下のように書くかなぁという 内容です。

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

public class TestMultiDispatch {
  public static void main(String[] args) {
    Zoo z = new Zoo();
    for( Animal a : new Animal[]{new Cat(), new Dog(), new Cat()}){
      z.enter(a);
      a.say();
    }
  }
}
class Zoo{

  Hashtable h = new Hashtable();
  public Zoo()
  {
    h.put(Dog.class, new ArrayList());
    h.put(Cat.class, new ArrayList());   
  }
  public void enter(Animal a){
    List list = (ArrayList)h.get(a.getClass());
    list.add( a );
  }
}
abstract class Animal{
  abstract public void say();
}
class Cat extends Animal{
  public void say(){
    System.out.println("にゃ〜");
  }
}
class Dog extends Animal{
  public void say(){
    System.out.println("わん!");
  }    
}
なんか主旨とズレてるけど。