W.I.S. Laboratory
menu-bar

Rust


Rustで動的ポリモーフィズムのようなことをしてみる(その1)

Rustは構造体の継承もできないしメソッドのオーバーライドもできないので、当然動的ポリモーフィズムはできない。(動的ポリモーフィズムとはざっくり言うと「親子関係のポリモーフィズム」のことなので、共通のトレイトを親とした「兄弟関係のポリモーフィズム」は可能だ。)
トレイトは継承できるのだが、メソッドの実装強制力が継承されるだけなので、要するにあっちからもこっちからも「このメソッドを書きなさい」と言われるだけだ。
基底構造体→派生構造体という感じの継承は無理な言語なのだ。
そのRustで、動的ポリモーフィズムに近いことをしてみようとがんばってみた。

動的ポリモーフィズムの基本は、クラスの継承・関数のオーバーライド・アップキャストだ。
この3つさえできればなんとかなる。
クラスは構造体で代用するとして、継承ができないので親に共通のトレイトを持たせる。
オーバーライドだけはどうやっても無理なので、オーバーライドしたいメソッドもしたくないメソッドも全部書く。
あとはアップキャストだが、これは構造体型→トレイト型にキャストするということで。

というわけで、1つのトレイトを親とした複数の構造体を作り、それぞれに同名メソッドを実装してインスタンスをトレイト型にキャストすれば・・それっぽい動きになってくれた。
ただ、オーバーライド不要な共通処理まで全構造体にimplすることになり、あちこちに全く同じコードが出来上がってしまうのでデバッグ時のメンテナンス性が落ちてしまう。
どうみてもこれはダックタイピングもどきだ。
その2へ続く


[ 戻る ]
saluteweb