...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

polymorphism vs duck typing (2)

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

うーん,こんなところだろうか?

追記

C++とかD言語だったら,後は静的か動的かの違いかなあ.