Go
Goで動的ポリモーフィズムのようなことをしてみる
Goは静的ポリモーフィズム(いわゆるダックタイピング)には強い言語だ。
ダックタイピングは元々動的型付け言語の手法として誕生したので、静的型付けのコンパイル型言語で本当のダックタイピングができるのはそう多くないと思う。(C++やD言語、Crystalなどは可能)
だが、オブジェクト指向型言語の3本柱である「カプセル化・継承・ポリモーフィズム」の「ポリモーフィズム」と言えば「動的ポリモーフィズム」のことだ。
C++とかJavaを書いてきた世代で「ポリモーフィズム」といえば「基底クラスが派生クラスへ振る舞いを変える」ことを言うのだ。(たぶん)
動的ポリモーフィズムの基盤となるのは、クラスの継承と関数のオーバーライド、そしてアップキャストだが、Goはオブジェクト指向型言語ではないのでこれらすべてできない。
なので無理やりやってみた。
まずクラスはないので構造体を使う。
構造体の継承ができないので、とりあえず親にインターフェースを持たせる。
オーバーライドはどうやってもできないので、オーバーライドしたい関数もしたくない関数もすべて構造体に紐づける。
アップキャストは構造体の型からインターフェースの型にキャストすればなんとなくOKだろう。
こんな感じになった。
実用的かというと、オーバーライドしたくない関数まで同じ内容をすべての構造体に紐づけてあちこちに書かなくてはならないので、メンテナンス性が最悪だ。
というわけで、オーバーライドできない以上これは動的ポリモーフィズムでなくダックタイピングだ。(結論)
|