Effective Java の 93-4 ページで、 mixinという用語に出くわしました。しかし、ミックスインが実際に何であるかを視覚化するのは難しいと感じています。Javaでのミックスインの例を提供して、誰か助けてくれませんか?
3 に答える
あなたはEffective JavaのItem 18を参照しています- 抽象クラスへのインターフェースを優先します、そして私は特に次のセクションを信じています:
インターフェイスは、ミックスインを定義するのに理想的です。大まかに言えば、ミックスインは、クラスが「プライマリ型」に加えて実装できる型であり、オプションの動作を提供することを宣言します。たとえば
Comparable
、クラスがそのインスタンスが他の相互に比較可能なオブジェクトに関して順序付けられていることを宣言できるようにする mixin インターフェイスがあります。このようなインターフェースは、オプションの機能をタイプの主要な機能に「混合」できるため、mixin と呼ばれます。抽象クラスは、既存のクラスに後付けできないのと同じ理由で、ミックスインの定義に使用できません。クラスは複数の親を持つことはできず、クラス階層にはミックスインを挿入する合理的な場所がありません。
基本的に、抽象クラスとインターフェースで機能を指定する際の重要な違いの 1 つは、インターフェース バージョンはさまざまなクラス階層で使用できるのに対し、抽象クラスは 1 つのクラス階層ツリーでしか使用できないことです。単一継承のみを許可します。
コードの一部を別の階層のクラスに追加する方法がないため、Java にはミックスインのようなものはありません。そのためには、複数の継承または少なくとも Scala 型の特性が必要になります。
「Effective Java」の範囲では、特定の Java 実装なしで論理的に言及されています。たとえば、Comparable インターフェイスです。クラスの目的を変更したり、API ユーザーを混乱させたりすることはありません。並べ替えと比較のための機能が混在しているだけです。したがって、Java コンテキストでは、これを Decorator パターンに絞り込みます。
ミックスインの別のバリエーションは次のとおりです。あなたが持っていると仮定します:
interface IMyInterface
{
public void doStuff();
}
class MyClass implements IMyInterface
{
public void doStuff(){};
}
ここで、いくつかの追加機能を「ミックス」したいと考えています。抽象クラスを追加します。
abstract class AbstractMixInProvider
{
public abstract void doMixinStuff();
}
そして、AbstractMixInProvider から MyClass を拡張します。
class MyClass extends AbstractMixInProvider implements IMyInterface
{
public void doStuff(){};
public void doMixinStuff();
}
しかし、上で述べたように、ミックスインの概念を Java に持ち込もうとするのは見苦しく見えます。