W.I.S. Laboratory
menu-bar

Rust


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

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

動的ポリモーフィズムの基本は、クラスの継承・関数のオーバーライド・アップキャストだ。
この3つさえできればなんとかなる。
クラスは構造体で代用するとして、構造体の継承ができないので親に共通のトレイトを持たせる。
オーバーライドは無理だが、幸いトレイトにメソッドの実態(デフォルト実装)が書けるし構造体にそれと同名メソッドをimplすればトレイトに書いたメソッドを上書きできる。なんかオーバーライドっぽいのでこれでやってみる。
あとはアップキャストだが、これは構造体型→トレイト型にキャストするということで。Box化すればそれが可能。

というわけで、1つのトレイトを親とした複数の構造体を作り、それぞれに同名メソッドを実装してインスタンスをトレイト型にキャストすれば・・それっぽい動きになってくれた。
ただ、基本クラスにあたる「ship」構造体と派生クラスにあたる「SuperShip」「HyperShip」の関係が親子ではなく、共通の親「BaseShip」を親とする兄弟関係になる。
トレイト自身にインスタンス生成能が無いので、どうがんばっても「親子」になれない → オーバーライドができない、というわけだ。
つまりどうみてもこれはダックタイピングもどきだ。
あと、トレイト型にキャストしている関係で、構造体のフィールドにアクセスできなくなってしまったので、これをなんとかしたい。
その2へ続く


[ 戻る ]
saluteweb