...ing logging 4.0

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

polymorphism vs duck typing

polymorphismとduck typingの使い分けって何か明確な基準があるんだろうか.
duck typingの方が後発だと思うので,当然,duck typingにはpolymorphismよりも優れた点があるんだと思う.
その上で,polymorphismの方がいいパターンはどういうものなんだろう.


コードはrubyがわかんないのでD言語で.


duck typing:

class A {void run(){}}
class B {void run(){}}
void run(Runnable)(Runnable runner)
{
  runner.run();
}
void main()
{
  run(new A);
  run(new B);
}


polymorphism:

interface I {void run();}
class A : I {void run(){}}
class B : I {void run(){}}
void run(I runner)
{
  runner.run();
}
void main()
{
  run(new A);
  run(new B);
}


うーん,ここまで同じように書いちゃうと,duck typingの方がコード量が少ないし柔軟性に富んでいるようだし,polymorphismのいいところが見えにくいなあ.
あえて明示的にinterfaceを介してメソッドを呼び出す必然のある状況って,一体どういうものだろう.
あるメソッドが存在することを保証するという意味では,どちらも同じだからなあ.
ただ,仕様書でinterfaceを定義しておいてclassの実装はおのおのに任せるという方針だったら,interfaceとclassが継承関係になければならないpolymorphismの方が制約が強い分,安心か?