トレイト (英: Trait) は、コンピュータープログラミングでの概念であり、専らオブジェクト指向プログラミングで用いられている。トレイトはメソッドの集合体であり、クラスの機能を拡張するために使われる[1][2]。
トレイトは、(1)自身が定義+実装しているメソッドを継承先クラスに注入する役割と、(2)自身が定義だけしているメソッドを継承先クラスに叙述してそこで実装させる役割の双方を持っている。定義=メソッドシグネチャ、実装=メソッドコードである。トレイトの継承は、インクルードと言われることが好まれるがそうでない言語もある。トレイトのインクルードを扱う作法はミックスイン(mixin)と言われることが多いがそうでない言語もある。なお、ミックスインでもトレイトを扱っていない言語もある。
トレイトは2000年代にSmalltalk方言のSqueakで最初に実装が試されてから、各言語で様々な形態に解釈されて導入されている。トレイトは多重継承されることから、同様の機能であるインターフェースとよく対比されて説明される。インターフェースとの違いは以下のようになる。
トレイトは合成(union)と交差(intersection)ができる。これも大きな特徴である。
S = A + BとT = B + AとしてのSとTは同型トレイトと判定される。X = B + CとしてS = A + Xとし、またT = A + B + Cとすると、SとTは同型トレイトと判定される[3]。また、専用の書式でメソッドを列挙しての”その場トレイト”を作成できる言語もある。”その場トレイト”は構造型(structural type)とも呼ばれており、合成と交差に利用できる。
トレイトは任意の数だけクラスに継承/インクルードさせることができる。ここでクラスの多重継承と同様に名前衝突や菱形継承問題が発生するが、それをより柔軟に解決できる方法をトレイトは備えている。それは以下のようなものである。
冒頭で述べた通り、トレイトはメソッドの集合体なので、合成と交差と構造型を用いての要素メソッドの自由な組み替えによって多重継承問題に対応できる。
トレイトを採用
トレイトの類似品/派生品を採用
Rustの他にもトレイトと称する言語機能を有する静的型言語もあるが、その本質は従来のミクスインのままである(平坦化されない)。ただし平坦なトレイトを模したりミクスインの問題点を回避する拡張を施すなどの工夫により、トレイトに近い使い勝手を実現している場合もある。
未登録
IPFS未登録
📡 0ピア
N=1
CRITICAL
PQS D34