- オブジェクト指向は愚かな考え。この世は計算式 [転載禁止]©2ch.net
992 :デフォルトの名無しさん[sage]:2015/12/16(水) 00:20:54.71 ID:R3uzXom/ - >>990
(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
|
- オブジェクト指向は愚かな考え。この世は計算式 [転載禁止]©2ch.net
995 :デフォルトの名無しさん[sage]:2015/12/16(水) 01:00:12.38 ID:R3uzXom/ - >>994
いや、Smalltalkだってコンパイル時に発見できてますよ? なんか、決定的な勘違いしてませんか?(たとえばSmalltalkがコンパイル言語と知らないとか)
|
- オブジェクト指向は愚かな考え。この世は計算式 [転載禁止]©2ch.net
998 :デフォルトの名無しさん[sage]:2015/12/16(水) 01:14:48.04 ID:R3uzXom/ - >>997
それは、コンパイル時には(検出はするが)あえてエラーは出さずに 実行時にエラーを出すスタブメソッドを動的に生成しているからですよ。
|
- オブジェクト指向は愚かな考え。この世は計算式 ★2 [無断転載禁止]©2ch.net
6 :デフォルトの名無しさん[sage]:2015/12/16(水) 01:35:54.96 ID:R3uzXom/ - 前スレ>>999
意味がないってことはないですよ。 動的遅延結合をモットーとするSmalltalkでは、コンパイル時間を短くするのはもちろん、 コンパイルが通らないエラーを含めてソフトウェアが動作しなくなる時間をできるだけ無くす必要があるので。 それに、エラーがでなくなるように修正するのと、スタブが生じないように修正するのとで 本質は変わらんでしょう。 あとSmalltalkはコンパイル処理も自身のプロセス内で動的に行なうしくみなので 「コンパイル時に」と「動的に」は矛盾しません。
|