Blu*_*eft 20
Mixin是Lisp的一个概念.Dobbs博士的一个很好的解释:
mixin是一个类的片段,意思是它要与其他类或mixin组合.
[...]
常规的独立类(例如Person)和mixin之间的区别在于mixin模拟一些小功能片(例如,打印或显示),而不是用于独立使用.相反,它应该由一些需要此功能的其他类组成(例如,Person).
所以,一个mixin的要点是允许的东西一样多继承,没有所有不好的事情™,通常伴随着多重继承来的.
然而,这可能有点令人困惑,因为C++本身不支持mixins; 为了在C++中"做"mixins,你必须使用多重继承!这最终意味着在实践中你仍然使用多重继承,但你通常会限制你允许自己使用它的东西.
请参阅上面的文章,了解实际的mixin实现.
tp1*_*tp1 15
如果我没记错,至少有两种方法可以在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();
}
Run Code Online (Sandbox Code Playgroud)
或者另一种方式使用虚拟继承和兄弟调用:
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();
}
Run Code Online (Sandbox Code Playgroud)
现在这两个版本都实现了mixin,因为Mixin和Mixin2是独立的类,但它们仍然可以通信.您可以从这种模块创建软件,然后将这些模块绑定到一个大软件.虚拟继承中D1和D2之间也是如此.需要注意的是,在mixin设计中,不同的模块存在于同一个c ++对象中.(哦和CRTP是不同的技术)
通常 mixin 被称为小类(通常是模板化的或基于 crtp 的),您可以从中派生出“混合”某些功能;通常通过多重继承和基于策略的设计(另请参阅 Alexandrescu 的“现代 C++ 设计”)。
归档时间: |
|
查看次数: |
19870 次 |
最近记录: |