什么是C ++ Mixin-Style?

时间:2011-08-16 21:28:23

标签: c++ mixins

我刚刚遇到过这个关键字C++ Mixin-Style,有人知道这是什么意思吗?

this post中,已被回答为设计模式。它是否与this document中描述的设计模式相同?

5 个答案:

答案 0 :(得分:20)

Mixins是Lisp的概念。来自Dr. Dobbs的一个很好的解释:

  

mixin是一个类的片段,意思是它要与其他类或mixin组合。
  [...]
  常规的独立类(例如Person)和mixin之间的区别在于mixin模拟了一些小功能片(例如,打印或显示),并不适合独立使用。相反,它应该由一些需要此功能的其他类组成(例如,Person)。

因此,mixin的意思是允许之类的多重继承,而没有通常伴随多重继承的所有Bad Things™。

然而,这可能有点令人困惑,因为C ++本身并不支持mixins;为了在C ++中“做”mixins,你必须使用多重继承!这最终意味着你在实践中的意思是你仍然使用多重继承,但你通常会限制你自己使用它的目的。

请参阅上面的文章,了解实际的mixin实现。

答案 1 :(得分:14)

如果我没记错,至少有两种方法可以在C ++中创建mixins。这来自我见过的一些非常古老的(1995)教程(但它现在几乎完全从互联网上消失了。)

首先,

class MixinBase {
public :
    void f() {};
};

template<class T>
class Mixin : public T {
public:
    void f() {
        T::f();
        T::f();
    }
};

template<class T>
class Mixin2 : public T {
public :
    void g() {
        T::f();
        T::f();
    }
};

int main() {
    Mixin2<Mixin<MixinBase>> mix;
    mix.g();
}

或者另一种方式使用虚拟继承和兄弟调用:

class Base {
public :
    virtual void f() = 0;
};

class D1 : public virtual Base {
public :
    void g() {
        f();
    }
};

class D2 : public virtual Base {
public :
    void f() {
    }
};

class D : public D1, public D2 {
};

int main() {
    D d;
    d.g();
}

现在这两个版本都实现了mixin,因为Mixin和Mixin2是独立的类,但它们仍然可以通信。您可以从这种模块创建软件,然后将这些模块绑定到一个大软件。虚拟继承中D1和D2之间也是如此。需要注意的是,在mixin设计中,不同的模块存在于同一个c ++对象中。 (哦和CRTP是不同的技术)

答案 2 :(得分:8)

Mixin是一个类(或其他代码组),旨在通过直接包含在另一段代码中来重用。将其视为没有子类型多态的继承。 CRTP是一种用C ++逼近Mixins的方法。

答案 3 :(得分:5)

C ++中的Mixins使用Curiously Recurring Template Pattern(CRTP)表示。 This post是对其他重用技术提供的优秀细分...编译时多态性。

答案 4 :(得分:4)

通常,mixins被称为小类(通常是模板化的或基于crtp的),你可以从中“混合”某些功能;通常通过多重继承和基于策略的设计(参见Alexandrescu的“Modern C ++ Design”)。