トレイト
From Wikipedia, the free encyclopedia
概要
トレイトは、多重継承が持つ柔軟性を提供しつつ、菱形継承問題といった問題を解決することを目的としている[5]。
クラス定義にトレイトを合成すると、そのトレイトが持つメソッドが、あたかもクラス自身で定義されたかのように利用可能になる[6]。
Mixinと似ているが、トレイトは以下の点で異なる特徴を持つ[5]。
- 状態を持たない: トレイトは基本的に振る舞い(メソッド)のみを提供し、状態(フィールドやインスタンス変数)を持つことはできない。
- 競合解決: 複数のトレイトが同じ名前のメソッドを持つ場合、クラス側で明示的にどちらを使用するか、あるいはどのように組み合わせるかを明示的に定義する必要がある。
サポートする言語
トレイト、またはロール (Role) のような類似の概念をサポートする言語には以下のようなものがある。
トレイトを採用
- Smalltalk - 最初のトレイトは Smalltalk 処理系のひとつである Squeak を使ってベルン大学のソフトウェア合成グループによって実装が試され[7]、その有効性が実証された[8]。Squeak にはその後、公式リリースにもトレイトが組み込まれ標準で利用可能となった。Squeak から派生した Pharo も同様。
- PHP - 5.4.0 からサポート[9]。
- Raku -「ロール」。Perl 5 では Moose モジュールで利用可能。なおロールの限定的な用途のみ「トレイト」と呼称し紛らわしい。
- JavaScript の Joose フレームワーク
- Ruby のモジュールのmix拡張(試作のみ)[10] - Ruby 2.0 向けの新機能として計画された[11]が運用上の問題が見つかり放棄された[12]。
トレイトの類似品/派生品を採用
- Rust - トレイトを有し、型変数に対する制約をトレイトで指定したり、ユーザー定義型の演算子に対する振る舞いを設定するのに利用されるが、その運用に際しそもそも衝突を許さないので(Orphan rule)、メソッドの集合という意味を除きSchärliの想定した使われ方はされず、トレイトとしては別物(実装の記述できるインタフェース程度)と考える方が良い。
- Fortress
- Scala[14][15]
- Groovy[16]