Mix-in(ミックスイン)とは
- Mix-inとはインスタンス変数を持たずメソッドだけを定義したクラスの事です。
- 継承されることを前提に作られています。
- 多重継承によりメソッド間でインスタンス変数の競合が起きることを防止します。
- Mix-inを好きなだけ継承することでサブクラスで必要な機能を追加する、といった使い方をします。
Wikipediaでは下記の通り
mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。言語によっては、その言語でクラスや継承と呼ぶものとは別のシステムとして mixin がある場合もある(#バリエーションの節で詳述)。
多重継承による問題とは
例えば、名前が同じインスタンス変数Xを持つクラスA(インスタンス変数=X, メソッド=MA)とクラスB(インスタンス変数=X, メソッド=MB)とクラスC(インスタンス変数=X, メソッド=MC)を継承してクラスDを作った場合を考えてみます。
この場合、クラスDからクラスAが持つメソッドMAとクラスBが持つメソッドMBとクラスCが持つメソッドMCを呼び出すとインスタンス変数Xが競合しているので、それぞれのメソッドの結果が予期しないものになる可能性があります。
このような問題を避けるため、クラスBとクラスCにはインスタンス変数を持たせないMix-inとします。すたわち、クラスB(メソッド=MB)とクラスC(メソッド=MC)とします。
こうすることで、クラスDはクラスAのインスタンス変数Xのみを継承しインスタンス変数の競合を解消しつつ、Mix-inとなったクラスBとクラスCのメソッドも利用できる訳です。
あとがき
プログラミング言語の中でPythonは多重継承にかなり寛容で、同じMix-inの仕組みを使うRubyでも多重継承は禁止しています。
PythonのWebアプリケーションフレームワークであるDjangoは、Mix-inをViewに継承させることでViewに様々な機能を簡単に追加できるようにしています。