C
C言語でダックタイピングのようなことをしてみる(その2)
前回はインターフェース用の親構造体を作って、その型にアップキャストすることでダックタイピングもどきをやってみたが、Cは柔軟な言語なのでそこまで律儀に書く必要はない。
全オブジェクトのメンバが同一という条件にはなるが、Cならひとつのユーザー定義型だけでダックタイピングもどきを書くことができる。
構造体をひとつ定義し、関数ポインタをそのメンバとする。
構造体のインスタンスを複数生成し、各々の関数ポインタに、それぞれ異なった関数アドレスを代入する。
こうすると、型は同じなのにインスタンスメソッドはそれぞれ振る舞いが違うというオブジェクトを作ることができる。
他のオブジェクト指向型言語からするとチートような実装だが、「(戻り値の型と引数の個数・型が同じ)関数ポインタ」であれば、そのポインタにどの関数アドレスが代入されていようと「同じ型」なので、Cでは問題ないコードになる。
こうして作った複数の構造体を関数に投げて、その関数が受け取った構造体メンバの関数ポインタを呼び出せば、ダックタイピングのような処理になる。
ただし、投げられる構造体はすべて同じ型である保証があるので、正確にはダックタイピングではない。
|