オブジェクト指向は愚かな考え。この世は計算式 [転載禁止]©5ch.io
レス数が950を超えています。1000を超えると書き込みができなくなります。
0992デフォルトの名無しさん
2015/12/16(水) 00:20:54.71ID:R3uzXom/(Scala のトレイトが Ruby のモジュール同様にミックスインだって話は納得していただけたんですかね…?)
たしかに、Scalaのトレイト同士のコンフリクトは override修飾子付き同名メソッド再定義で
回避する必要があり結果的に解消できますが、コンフリクト解消のためだけにメソッドを再定義する
という手段は、言語機能と呼ぶにはちょっとスジが違うような気がします。
あと、ミックスイン、つまりScalaのトレイト等、クラス様エンティティを継承パスに挿入する古典的な方式の問題は、
継承パスが汚染されて、super によるスーパークラスのメソッド呼び出しが素直に振る舞わないことじゃないかと。
たとえばこんな感じに、
http://ideone.com/v4MJE0
継承した B ではなく、ミックスインした T2 の同名メソッドがコールされてしまうところとか、
そうならないように、継承した B のメソッドを呼ぶには super[B] などと明示的にしないといけないところとか。
(ミックスインといっても継承なので、super でミックスインが呼ばれるのは当たり前といえば当たり前なのですが…)
なお、仕組み上、継承とは関係ないトレイトにはそういった制約は生じないので素直に書けるし振る舞います。
(ideone.com の Smalltalk はトレイトが使えなさそうな GNU Smalltalk なので、PHP で)
http://ideone.com/qFM4xa
蛇足ですが念のため、この振る舞いに関しては Ruby は super ではスーパークラスの別メソッドが呼べない仕様から
それを回避するトリッキーな手段をとると(そこで使う superclass が M2 ではなく B を返す細工があることも幸いして)
後者のトレイトと同じ結果になってしまいます。けれど、これは super が M2#m を呼ぶことを鑑みても
たまたまそうなっただけだと考えるのがよさそうです。
http://ideone.com/aFL0sL
レス数が950を超えています。1000を超えると書き込みができなくなります。