Scalaのtraitはmixinか?

Rubyのmixin(モジュール)、Squeakのtrait、Scalaのtraitそれぞれについて:

Q1: メソッドの実装を持てる?

はい、はい、はい

Javaのクラスは「はい」、インターフェイスは「いいえ」、C++Pythonのクラスは「はい」

Q2: クラスがそれを複数個継承できる?

はい、はい、はい

Javaのクラスは「いいえ」、インターフェイスは「はい」、C++Pythonのクラスは「はい」

Q3: インスタンスを作れる?

いいえ、はい、いいえ

C++Pythonのクラスは「はい」

Q4: 複数個継承した際に名前が衝突しました、どうなる?

しれっと上書き、エラー(*)、エラー

(*) Squeakはクラス定義時には例外を投げず、衝突したメソッドを「衝突した旨の例外を投げるメソッド」に置き換える。ユーザが衝突に気づくのは、クラスブラウザでメソッドを確認した時か、そのメソッドを呼んだ時になる。

Q5: 継承パスに参加する?

する(?)、しない、する(?)

継承パスに参加しているかどうかの検証の仕方や、プログラミング言語のユーザにどういう影響をあたえるのか、がイマイチよくわからない。

Q6: それを継承したクラスが特定のメソッドを持つことを型で強制できる?(Scalaのself type annotation)

いいえ、いいえ、はい

Q7: あるクラスがそれと別のクラスとを継承している場合に、親クラスとそれとの間で名前が衝突したらどうなる?

それの定義で上書き、それの定義で上書き、エラー

まとめ

Q1 Y, Y, Y
Q2 Y, Y, Y
Q3 N, Y, N
Q4 O, E, E
Q5 Y, N, Y
Q6 N, N, Y
Q7 O, O, E

まあ、要するに「3つそれぞれ別物」だね。id:sumimさんの主張(Scalaのトレイトは実はトレイトじゃなくただのミクスイン)はQ5に関してScalaのtraitはmixinみたいなものということだし、id:kmizushimaさんの主張はQ4とかQ6のことを考えるとmixinとは違うだろということだろう。個人的にはQ3でSqueakが「はい」な点にギョッとした。

ソースコード: https://github.com/nishio/learn_language/tree/master/trait
気が向いたらC++とかPythonとかも追加しよう。