トレイト

トレイト () は、コンピュータプログラミングにおいて、クラスの振る舞いを再利用するために用いられるメソッドの集合である「Traits: Composable Units of Behaviour」『ECOOP 2003 — Object-Oriented Programming』、Springer Berlin Heidelberg、2003年、248-274頁「Traits: A mechanism for fine-grained reuse」『ACM Transactions on Programming Languages and Systems (TOPLAS)』28巻、2号、ACM、2006年、331-388頁、、、 共著、.  （ECOOP）.  誌、2743巻、、2003年、pp. 248-274、、、、 共著:   誌、28(2): 331-388 (2006) 。

 概要 
トレイトは、多重継承が持つ柔軟性を提供しつつ、菱形継承問題といった問題を解決することを目的としている「Traits: A mechanism for fine-grained reuse」『ACM Transactions on Programming Languages and Systems (TOPLAS)』28巻、2号、ACM、2006年、331-388頁。

クラス定義にトレイトを合成すると、そのトレイトが持つメソッドが、あたかもクラス自身で定義されたかのように利用可能になる「Traits: Composable Units of Behaviour」『ECOOP 2003 — Object-Oriented Programming』、Springer Berlin Heidelberg、2003年、248-274頁。

Mixinと似ているが、トレイトは以下の点で異なる特徴を持つ。
 状態を持たない: トレイトは基本的に振る舞い（メソッド）のみを提供し、状態（フィールドやインスタンス変数）を持つことはできない。
 競合解決: 複数のトレイトが同じ名前のメソッドを持つ場合、クラス側で明示的にどちらを使用するか、あるいはどのように組み合わせるかを明示的に定義する必要がある。

 サポートする言語 
トレイト、またはロール (Role) のような類似の概念をサポートする言語には以下のようなものがある。

トレイトを採用
 Smalltalk - 最初のトレイトは Smalltalk 処理系のひとつである Squeak を使ってベルン大学のソフトウェア合成グループによって実装が試されNathanael Schärli, Stéphane Ducasse, Oscar Nierstrasz, and Andrew P. Black. Traits: Composable Units of Behavior. Technical Report -2, Institut für Informatik, Universität Bern, Switzerland, November 2002、その有効性が実証されたAndrew P. Black, Nathanael Schärli, and Stéphane Ducasse. Applying Traits to the Smalltalk Collection Hierarchy. Technical Report -2, Institut für Informatik, Universität Bern, Switzerland, November 2002。Squeak にはその後、公式リリースにもトレイトが組み込まれ標準で利用可能となった。Squeak から派生した Pharo も同様。
 PHP - 5.4.0 からサポート。
 Raku -「ロール」。Perl 5 では Moose モジュールで利用可能。なおロールの限定的な用途のみ「トレイト」と呼称し紛らわしい。
 JavaScript の Joose フレームワーク
 Ruby のモジュールのmix拡張（試作のみ）http://marc.info/?l=ruby-cvs&m=130685857122161 - Ruby 2.0 向けの新機能として計画されたhttps://www.rubyist.net/~matz/20100617.htmlが運用上の問題が見つかり放棄されたhttps://ruby-trunk-changes.hatenablog.com/entry/20111003/ruby_trunk_changes_33379_33380。
トレイトの類似品/派生品を採用

 Swift - protocol、extensionを利用することでトレイトを実現することができる。

 Rust - トレイトを有し、型変数に対する制約をトレイトで指定したり、ユーザー定義型の演算子に対する振る舞いを設定するのに利用されるが、その運用に際しそもそも衝突を許さないので（Orphan rule）、メソッドの集合という意味を除きSchärliの想定した使われ方はされず、トレイトとしては別物（実装の記述できるインタフェース程度）と考える方が良い。

 Fortress
 Scalahttps://www.scala-lang.org/node/126 https://www.ibm.com/developerworks/java/library/j-scala04298.html 
 Groovyhttp://docs.groovy-lang.org/next/html/documentation/core-traits.html 

脚注

関連項目
ミックスイン
多重ディスパッチ
継承
サブタイピング
インターフェース
デリゲート
ポリモーフィズム

外部リンク
http://www.iam.unibe.ch/~scg/Research/Traits/
https://traitsjs.org traits.js - Traits for JavaScript

Category:プログラミング