W.I.S. Laboratory
menu-bar

Rust


Rustでトレイトの継承をしてみる

Rustは構造体の継承はできないが、トレイトからサブトレイトへメソッド実装の強制力を継承することができる。
これによって、構造体へのimpl時に、トレイトとサブトレイト両方からの実装強制を受けるようになる。
あくまで実装強制力の継承なので、継承してもしなくても結果としては同じようなコードになる。
構造体へメソッドをimplする際に、継承関係にあるすべてのトレイトに対してimplしていないとき、コンパイラが「このトレイトのimplを忘れてるよ」と教えてくれるようになるだけだ。
なのでC++やJavaのような「親が持っているものはすべて子も持っているから改めて書かなくてもいい」という便利な継承のイメージではないし、クラス継承のような明確な親子関係もないので、どちらかというと「継承」というよりも「紐づけ」という感じがする。
デフォルト実装したメソッドに関しては、構造体へのimpl時にそのメソッドを書く必要はないが、同名のメソッドを書いた場合はimpl側で上書きされる。(オーバーライドできない)

Rustのトレイトは、PHPのトレイトのようでもあるしJavaのインターフェースのようでもあるのだが、そのどちらとも違う。
メソッドの実態を書くことができる点や、それらを組み合わせimplして使える点ではPHPのトレイトに似ている。
ただPHPは複数のトレイトをuseする際にメソッド名衝突を許さないが、Rustでは複数のトレイトをimplする際にメソッド名衝突を許す。(呼び出しの際は TraitName::method_name(&instance) としてどのトレイト内のメソッドかを明示する必要がある)
メソッドの実装を強制できるという点ではJavaのインターフェースっぽいが、多重継承できないという点ではインターフェースっぽくない。
PHPでいう「トレイト」とも違うし、Javaでいう「インターフェース」とも違う、Rust独特の機能だ。


[ 戻る ]
saluteweb