ほかのクラスにincludeしたり、オブジェクトにextendして、モジュールのメソッドを追加させることができます。クラス/オブジェクトには複数のモジュールを付けられます。メソッド定義の共有ができます。クラスの関係を見てみると、モジュールはModuleクラスのインスタンスになります。Classクラスの直接のインスタンスではないので、モジュールをインスタンス化できないのは明らかです。ClassクラスはModuleクラスのサブクラスになっています。ありがちな設計上の誤りで、本来継承関係にないものを継承させてしまっていると思います。次の現象が起こっています;Classクラスで、Moduleクラスで定義されたメソッドのいくつかを削除しているモジュールが書けるところにクラスが書けるとは限らないModuleクラスで定義されているメソッドについても、モジュールに関係ないものが多くあります。includeモジュールは次のようにして定義します。メソッドはインスタンスメソッドの形で定義します。クラスメソッドは後述。注意.定義したモジュールは、クラスでincludeします。モジュールのメソッドがオブジェクトのメソッド呼び出し経路に挿入されます。クラスメソッドで確認できます。スーパークラス、の順です。無視される、とあるが、正しくは菱形継承になっている。するとサブクラスのそれが無視される、という組み合わせなので、スーパークラスでのデザイン変更が、サブクラスに影響してしまう。先に宣言したほうが優先になっていないことによる混乱。includeした場合は、後からincludeされた方が、先に検索されます。インスタンス変数の領域は、クラスのインスタンスでただ一つだけが確保されます。includeされたモジュールのメソッドでインスタンス変数を使うと、異常な挙動になる危険があります。D#g()も同様です。エラーも出ないので、分かりにくいバグの温床です。インスタンス変数名にモジュール名を含めるなどしてほかのクラスやモジュールと名前が被らないようにしなければなりません。多重継承における状態の持ち方の問題です。多重継承を認めるがメンバ変数が共有される。(運用で気をつける)。衝突しにくく実害が起きにくい。なり、状態を持てない。interfaceのデフォルト実装も、Java8と同じ考え方。C++は、多重継承ありでクラスごとにメンバ変数を持つので、上記の問題とは世界が違う。includeできます。