トレイト
即ちS = A + BとT = B + AとしてのSとTは同型トレイトと判定される。
トレイトの合成は平坦化される。即ちX = B + CとしてS = A + Xとし、またT = A + B + Cとすると、SとTは同型トレイトと判定される。
また、専用の書式でメソッドを列挙しての”その場トレイト”を作成できる言語もある。”その場トレイト”は構造型(structural type)とも呼ばれており、合成と交差に利用できる。
トレイトは任意の数だけクラスに継承/インクルードさせることができる。ここでクラスの多重継承と同様に名前衝突や菱形継承問題が発生するが、それをより柔軟に解決できる方法をトレイトは備えている。それは以下のようなものである。
対称和(symmetric sum)- トレイトは合成できるので、多重継承を”その場合成トレイト”に置換できる。
非対称和(override / asymmetric sum)- トレイトのメソッドを継承/インクルード先のメソッドでオーバーライドして、メソッド実体を任意に入れ替えることができる。
別名化(alias)- 各メソッドをリネームした”その場トレイト”を継承対象に置換できる。
排除(exclusion)- トレイトは交差できるので、必要メソッド群を切り抜いて不要メソッド群を除外した”その場トレイト”を多重継承に置換できる。
冒頭で述べた通り、トレイトはメソッドの集合体なので、合成と交差と構造型を用いての要素メソッドの自由な組み替えによって多重継承問題に対応できる。
Curl - 抽象クラスを多重継承することでトレイトを実現することができる。
Swift - protocol、extensionを利用することでトレイトを実現することができる。
Rust - トレイトを有し、型変数に対する制約をトレイトで指定したり、ユーザー定義型の演算子に対する振る舞いを設定するのに利用されるが、その運用に際しそもそも衝突を許さないので(Orphan rule)、メソッドの集合という意味を除きSchärliの想定した使われ方はされず、トレイトとしては別物(実装の記述できるインタフェース程度)と考える方が良い。
Rustの他にもトレイトと称する言語機能を有する静的型言語もあるが、その本質は従来のミクスインのままである(平坦化されない)。ただし平坦なトレイトを模したりミクスインの問題点を回避する拡張を施すなどの工夫により、トレイトに近い使い勝手を実現している場合もある。
Fortress
Scala
Groovy