polymorphismとduck typingの使い分けって何か明確な基準があるんだろうか.
duck typingの方が後発だと思うので,当然,duck typingにはpolymorphismよりも優れた点があるんだと思う.
その上で,polymorphismの方がいいパターンはどういうものなんだろう.
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の方が制約が強い分,安心か?