Rust
Rustのトレイトをトレイトっぽく使ったりインターフェースっぽく使ったりしてみる
Rustのトレイトは純粋にトレイトかと言われると、トレイトじゃない気がする。
巷ではよく「Rustのトレイトはインターフェースに近い」と言われているが、メソッドのデフォルト実装ができ、それらを構造体へimplして使うことができる点でインターフェースでもないと思う。
ミックスインかと言われると、そもそもミックスインという言葉をどう捉えるのかが人によって異なるので、なんともいえない。
ちなみに私はミックスインを「複数のメソッド集合をクラス内に含める作法のこと」だと思っている。
ミックスインされるメソッド集合は、トレイトだったり、メソッドのみで構成されたクラスだったり、モジュールだったりと言語によって異なるが少なくとも「ミックスイン」をプログラミング言語の「機能名」ではなく、「作法の呼び名」だと認識している。
話が逸れたが、Rustのトレイトは一般的なトレイトのように使うこともできる。
このような使い方をした場合、インターフェースとはとても呼べない。
ただしRustのトレイトはメソッド名の衝突を許す(ただし呼び出し時には TraitName::method_name(&instance) としてトレイト名を指定する必要がある)が、一般的には複数トレイト内のメソッド名衝突は許されない。
インターフェースとして使うときは、トレイトにはメソッドの実態を書かず、シグネチャのみを記述する。
こうすると、構造体へのメソッド実装を強制することができる。
トレイトを定義する際、トレイト名の後にコロンを置いて他のトレイト名を書くと、実装強制力を継承(紐づけ)できるので、impl忘れを防ぐことができる。
|