今回は、以前紹介したDartの基本構文紹介記事では触れなかった、DartのMixinと呼ばれるよばれるものについて紹介します。
Dart公式をベースに解説を進めます。
Mixinとは
ミックスインは、複数のクラス階層でクラスのコードを再利用する方法です。
クラスベースのオブジェクト指向言語における「継承(extends)」では表現できないようなクラス構成の際に用いることになります。
実際にMixinを使う例を見てみましょう。
以下の例のように、Mixinはwithを使って表現することになります。通常の「継承(extends)」と異なり、複数のクラスを束ねることができます。
class Musician extends Performer with Musical {
// ···
}
class Maestro extends Person
with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
Mixinを実装するには、コンストラクターを宣言していない(=デフォルトのコンストラクタしか持たない)クラスを作成する必要があります。
Mixinとして用いるクラスを作成する場合は、以下の例のようにclassではなくmixinを用いて定義します。
mixin Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}
このケースでは、MusicianクラスやMaestroクラスは、Musicalをwith句を用いてミックスインしているため、
Musicalクラスのもつ変数であるcanConduct/camCompose/canPlayPianoを持ち、entertainMe()関数を呼び出すことができます。
基本的には通常の継承とほぼ同じような形になりますが、例のように複数クラスを束ねることが可能な点が特徴になります。
そのためにデフォルトコンストラクタのみを持つようにしないといけない、ということが理解できると思います。(もし引数を持つコンストラクタがあれば、複数ミックスインした際にどのコンストラクタが正しいのかわからなくなりますよね)
Mixinを扱う際に注意したいこと
今回の例で作成したMusicalクラスは、どのクラスでもwith句を使ってミックスインすることが可能となっています。つまり、Musicalとは関係の無いクラス、例えばInsect(虫)クラスでも継承することが可能となっています。
こういったケースのようにミックスインさせるクラスに制限をかけたい場合が出た場合は、on句を使うことで対処可能です。
class Musician {
// ...
}
mixin MusicalPerformer on Musician {
// ...
}
class SingerDancer extends Musician with MusicalPerformer {
// ...
}
上記例では、MusicPerformerクラスをwith句でミックスインできるのは、MusicianクラスまたはMusicianクラスを継承したクラスのみとなります。
例として、Musicianをextends句で拡張しているSingerDancerクラスはMusicalPerformerクラスをwith句でミックスインできます。
最後に
Mixinのメリットについておさらいしましょう。
- 複数クラスをミックスイン可能
- 継承無しにコードの流用が可能
- 結果として疎結合なプログラムを書きやすい
コメントを残す