W.I.S. Laboratory
menu-bar

Rust


Rustのトレイトにデフォルト実装したメソッドはオーバーライドできるか

結論から書くと、できない。(オーバーライドというより単に上書きされる)
まずtraitを親とし、structを子として、どちらにも同じシグネチャのメソッドを実装する。
trait「BaseClass」の方はデフォルト実装としてその場に書いておいて、struct「DerivedClass」の方はimplしてメソッドを書いておけばOKだ。

DerivedClassをBaseClassの型へアップキャストするにはBox化しておかなくてはならないので、DerivedClassのインスタンスをBox化しておく。
このインスタンスのfunc_a()メソッドを呼ぶと、DerivedClassにimplしたメソッドが呼ばれる。
DerivedClassのインスタンスをBaseClass型へキャスト(つまりアップキャスト)してfunc_a()メソッドを呼ぶと、やはりDerivedClassにimplしたメソッドが呼ばれる。
ここまでの動作はオーバーライドに近い。
例えばC++でも親クラスに仮想関数を書いておき、子クラスに仮想関数と同シグネチャのメンバ関数を書くと、同じ挙動になる。
しかし親クラス側が仮想関数でなく普通の関数の場合は、アップキャストすると親クラスに書いた関数の動作になってしまう。

オーバーライドされているかどうかの検証は、親クラスのインスタンスを生成して親クラスに実装されたメソッドを呼び出し、その後子クラスのインスタンスを生成してアップキャストして同じメソッドを呼び出した時に、子クラスに書いたメソッドの動作になるかどうかを見れば良いのだが、Rustはトレイト自身にインスタンス生成能が無いため、トレイトにデフォルト実装したメソッドを呼び出す術がない。
つまりRustはメソッドのオーバーライドはできない。(struct側で書いたメソッドで上書きされてしまうだけ)


[ 戻る ]
saluteweb