Scalaのtraitはmixinか?
Rubyのmixin(モジュール)、Squeakのtrait、Scalaのtraitそれぞれについて:
Q4: 複数個継承した際に名前が衝突しました、どうなる?
しれっと上書き、エラー(*)、エラー
(*) Squeakはクラス定義時には例外を投げず、衝突したメソッドを「衝突した旨の例外を投げるメソッド」に置き換える。ユーザが衝突に気づくのは、クラスブラウザでメソッドを確認した時か、そのメソッドを呼んだ時になる。
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とかも追加しよう。