ミックスイン: 継承を行わずにクラスの機能を拡張する
ミックスインは、開発者が継承を行わずにクラスの機能を拡張できるようにするオブジェクト指向プログラミングの概念です。伝統的な継承を使用します。これらは、抽象クラスに似ていますが、構成に異なるアプローチを提供するため、「抽象サブクラス」と呼ばれることがよくあります。
ミックスインを理解するには、次の状況を考慮してください。クラスとしてモデル化したい複数の直交する概念がある。 。各概念は個別ですが、組み合わせてより複雑なクラスを作成できる機能を備えている場合があります。
伝統的に、これは継承を使用して実現され、各概念は共通のインターフェイス クラスのサブクラスになります。ただし、このアプローチでは、これらの具象クラスを新しい型に簡単に結合する能力が制限されます。
ミックスインは、基本的な直交概念を表すプリミティブ クラスのセットを導入することで、この問題を解決します。これらのプリミティブは、特定の機能を備えた複雑なクラスを作成するために組み立てることができる構成要素として機能します。この拡張性により、既存のプリミティブに影響を与えることなく新しいプリミティブを追加できます。
C では、テンプレートと継承を使用してミックスインを実装できます。ビルディング ブロックをテンプレート パラメーターとして渡すことで、typedef を介してそれらを接続し、連鎖させて、必要な機能を備えた新しい型を形成できます。
例: 元に戻す機能とやり直し機能
Number クラスに元に戻す機能とやり直し機能を追加する例を考えてみましょう。ミックスインの実装は次のようになります。
<code class="cpp">#include <iostream> using namespace std; struct Number { typedef int value_type; int n; void set(int v) { n = v; } int get() const { return n; } }; template <typename BASE, typename T = typename BASE::value_type> struct Undoable : public BASE { typedef T value_type; T before; void set(T v) { before = BASE::get(); BASE::set(v); } void undo() { BASE::set(before); } }; template <typename BASE, typename T = typename BASE::value_type> struct Redoable : public BASE { typedef T value_type; T after; void set(T v) { after = v; BASE::set(v); } void redo() { BASE::set(after); } }; typedef Redoable<Undoable<Number>> ReUndoableNumber; int main() { ReUndoableNumber mynum; mynum.set(42); mynum.set(84); cout << mynum.get() << '\n'; // 84 mynum.undo(); cout << mynum.get() << '\n'; // 42 mynum.redo(); cout << mynum.get() << '\n'; // back to 84 }</code>
Undoable および Redoable ミックスインを Number クラスと組み合わせることで、変更を元に戻したりやり直したりする機能を持つ新しいクラス ReUndoableNumber を作成します。これは、ミックスインが従来の継承を行わずにクラスの機能をどのように拡張できるかを示しています。
以上がミックスインは継承を使用せずにクラスの機能をどのように拡張できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。