メメメモモ

プログラミング、筋トレ、ゲーム、etc

Mixinについて

Mixinとは、オブジェクト指向の多重継承の欠点を最小にして利点を生かすテクニックです。


多重継承の欠点とは以下のようなものです。

  • 構成が複雑になってしまう
  • クラス群の優先順位が分からなくなる
  • メソッドの名称が衝突してしまうことがある

これらの欠点を解決する方法として、下記のようなものがあります。

  • 多重継承を禁止してしまう
  • Mixinを使う

多重継承を禁止してしまう

この方法をとっているのはJavaです。
Javaでは、多重継承を行なえないようになっています。
代わりにインタフェースというものがあります。


継承には2種類の目的があります。

  • 仕様の継承
    • どのようなメソッドを持っているか、どのように振る舞うか
  • 実装の継承
    • どのようなデータ構造を使い、どのようなアルゴリズムで処理するか


仕様の継承は、インターフェースにあたります。
実装の継承は、「extends」での継承にあたります。


Javaでは、二種類の継承を分けて、仕様の継承のみ多重にできるようにしています。


このようにして、データ構造の衝突やクラス階層の複雑化などを回避しています。


しかし、インタフェースには、不満点があります。
それは、実装を共有できないことです。
継承の階層を超えて実装を共有したい場合に、不便さや実行効率の悪さがでてきてしまいます。

Mixin

Mixinでは、実装の多重継承を行ないます。
ただし、下記のような制限をかけます。

  • 通常の継承は単一継承
  • 2つめ以降は、Mixinクラスという抽象クラスに限定する


Mixinクラスとは下記のような特徴を備えた抽象クラスです。

  • 単独でインスタンスを作らない
  • Mixinクラス以外のクラスから継承しない


これらの規則を守りながら、多重継承を行なえば、クラスの階層の複雑化を回避できます。


Mixinはテクニックですので、多重継承をサポートしている言語(C++,Ruby,Perlなど)で行なえます。


rubyは、言語レベルでMixinをサポートしています。