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中文网其他相关文章!