Web上に良いまとめがない為、書き残す。なお、内容が正しいかどうかの保証は無い。
Mix-inというのは元々Lisp界で始まった多重継承の使い方です。Mix-in手法には次の2つの条件があります。
●通常の継承は単一継承に限る
●2つめ以降の継承は,Mix-inと呼ばれる抽象クラスからに限定するMix-inクラスは以下のような特徴を備えた抽象クラスです。
●単独でインスタンスを作らない
●通常のクラスから継承しない
引用元 : まつもと直伝 プログラミングのオキテ 第3回(3)
実体を持たない(⇔メンバ変数を持たない)為、親クラスの同一のメンバ変数の実体が複数存在してしまうという、菱型継承の問題の一つが発生しない(そもそもクラスごとに必要な実装をmix-inすることで菱型にしなくて済む)。もちろん例えばC++では仮想継承を使うことでも同様の問題は解決できるが元々菱型継承の可能性を考えて継承しておく必要があり面倒である。
なお、実体がないだけで、メンバ変数へアクセスがないとは限らない。Rubyでは以下の様なこともできる。
module Fuga def foo p @bar end end class Hoge include Fuga def initialize @bar = "baz" end end obj = Hoge.new obj.foo # => "baz"
引用元:RubyのModuleについて - mirichiの日記
ただし、C++等では直接同じことを行うのは不可能(仮想関数を用いないと多態性が実現できない)であるし、出来る言語であってもpublic変数を避けるような言語では同様に控えた方が良いだろう。
mix-inは実装の多重継承ができる言語では実現出来る。実装の多重継承が存在しない場合でも例えば、Java8ではインターフェースのデフォルト実装で、C#ではインタフェース+拡張メソッドでmix-inが実現できる。
参考: Java8のインタフェース実装から多重継承とMix-inを考える | ギークを目指して, C# 3.0 で拡張メソッドによる Mix-in 的ななにか - いげ太のブログ
またデザインパターンのテンプレートメソッドとかなり形が酷似している。