trait
メソッド名が被ったときにどうするかという話
シェルリのtrait/Squeakのtrait/PHPのtraitだと、どっちかを明示的に選ぶ
「メソッドの集合」のようなかんじ
Pythonのmixin/Rubyのmodule/Scalaのtraitの場合、「順番」によりどっちかが選ばれる
抽象クラスに近い
てかPython多重継承あるんか。
多重継承といえば菱形継承問題。
え、このへんの議論が簡潔にまとまってるじゃん。神か。
少し前の本なのでRustのtraitへの言及はないけど。
クラス
もともとは「分類」だった
Simula/C++のクラス
型
仕様の表明 (vs. Smalltalk)
多重継承
1) 多重継承の禁止
2) メソッド解決順序でなんとかする
3) 「インスタンスを作れないクラス」(RubyのModule)のみ多重を許す
ClassをModuleのサブクラスにするか
メソッドが被った場合の挙動をどうするか
順番で制御(Ruby風)
明示的に指定(シェルリのtrait風)
この場合ModuleよりTraitという名前のほうがよさそう
衝突が許されている。「TraitA/TraitBのどっちとして使うか」を明示する手段が用意されているため
オーバーライドではない(superみたいにしてデフォルト実装を呼ぶ方法がない?)
C#も実は衝突が許される(へぇー)