我刚刚遇到过这个关键字C++ Mixin-Style
,有人知道这是什么意思吗?
在this post中,已被回答为设计模式。它是否与this document中描述的设计模式相同?
答案 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”)。