http://d.hatena.ne.jp/haru-s/20070613/1181756178 の続き.
polymorphism(というか interface)を使えば,「ここでは使わないメソッドも持っていないといけない」という制約を実現できるなあ.
polymorphism:
interface I { void run(); void walk(); } class A : I { void run(){} void walk(){} } class B : I { void run(){} void walk(){} } void run(I runner) { runner.run(); // ここで .walk() も実行可能であることが保証されている } void main() { run(new A); run(new B); }
duck typing:
class A { void run(){} void walk(){} } class B { void run(){} } void run(Runnable)(Runnable runner) { runner.run(); // .run() さえ持っていれば実行可能 } void main() { run(new A); run(new B); }
要するに,
- 「関数内で interface I を使って似るなり焼くなり好きなようにしてくれ」→ 実装の...部分を曖昧にしておける
void run(I runner){...}
- 「.run()さえ持っていればそのオブジェクトを許可するよ」→ 操作対象のRunnable部分を曖昧にしておける
void run(Runnable)(Runnable runner){runner.run();}
うーん,こんなところだろうか?