Mixin:無需繼承即可擴展類別功能
Mixin 是物件導向程式設計中的一個概念,它允許開發人員無需繼承即可擴展類別的功能使用傳統繼承。它們通常被稱為“抽象子類”,因為它們類似於抽象類,但提供了不同的組合方法。
要理解 mixin,請考慮以下情況:您有多個正交概念想要建模為類別。雖然每個概念都是不同的,但它們可能具有可以組合起來創建更複雜的類別的功能。
傳統上,您可以使用繼承來實現此目的,其中每個概念都成為公共介面類別的子類別。然而,這種方法限制了您將這些特定類別輕鬆組合成新類型的能力。
Mixin 透過引入一組表示基本正交概念的原始類別來解決這個問題。這些原語充當構建塊,可以組裝它們以創建具有特定功能的複雜類別。這種可擴展性允許您添加新的原語而不影響現有的原語。
在 C 中,mixins 可以使用模板和繼承來實作。透過將建構塊作為模板參數傳遞,您可以將它們連接起來,並透過 typedef 將它們連結在一起,形成具有所需功能的新類型。
範例:撤銷和重做功能
讓我們考慮一個在 Number 類別中新增撤銷和重做功能的範例。 mixin 實作可能如下所示:
<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 mixin 與 Number 類別結合,我們建立了一個新類別 ReUndoableNumber,它具有撤銷和重做更改的功能。這演示了 mixin 如何在沒有傳統繼承的情況下擴展類別的功能。
以上是Mixin 如何在不使用繼承的情況下擴展類別功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!