c++ mixins

¿Qué es C++ Mixin-Style?



mixins (5)

Mixins en C ++ se expresan usando el patrón de plantilla Curiously Recurring Template (CRTP). Esta publicación es un desglose excelente de lo que proporcionan sobre otras técnicas de reutilización ... polimorfismo en tiempo de compilación.

Acabo de encontrar esta palabra clave C++ Mixin-Style , ¿alguien sabe qué es esto?

En esta publicación , se ha respondido como un patrón de diseño. ¿Es el mismo patrón de diseño que se describe en este documento ?


Por lo general, las mixinas se denominan clases pequeñas (a menudo basadas en plantillas o basadas en crtp) de las que se derivan para "mezclar" alguna funcionalidad; generalmente a través de herencia múltiple y en diseños basados ​​en políticas (también vea "Diseño moderno de C ++" por Alexandrescu).


Si recuerdo esto correctamente, hay al menos dos formas de crear mixins en C ++. Esto proviene de un tutorial muy antiguo (1995) que he visto (pero casi ha desaparecido por completo de internet).

Primero,

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(); }

O de otra forma usa herencia virtual y llamadas entre hermanos:

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(); }

Ahora estas dos versiones implementan mixins, porque Mixin y Mixin2 son clases independientes, pero aún pueden comunicarse. Y puede crear software a partir de este tipo de módulos y luego simplemente vincular esos módulos a un gran software. Lo mismo sucede entre D1 y D2 en la herencia virtual. Es importante notar que en el diseño de mixin los diferentes módulos viven dentro del mismo objeto de c ++. (oh y CRTP es una técnica diferente)


Un Mixin es una clase (u otra agrupación de código) que se pretende reutilizar a través de la inclusión directa en otro fragmento de código. Piense en ello como herencia sin un polimorfismo de subtipo. El CRTP es una forma de aproximar Mixins en C ++.


Mixin s es un concepto de Lisp. Una buena explicación del Dr. Dobbs :

Un mixin es un fragmento de una clase en el sentido de que está destinado a ser compuesto con otras clases o mixins.
[...]
La diferencia entre una clase regular independiente (como Person) y una mixin es que una mixin modela una pequeña porción de funcionalidad (por ejemplo, impresión o visualización) y no está diseñada para uso independiente. Por el contrario, se supone que se compone con alguna otra clase que necesita esta funcionalidad (Persona, por ejemplo).

Por lo tanto, el objetivo de una mezcla es permitir algo así como la herencia múltiple, sin todas las cosas malas ™ que generalmente vienen con la herencia múltiple.

Esto puede ser un poco confuso, sin embargo, porque C ++ no admite nativamente mixins; para poder "hacer" mezclas en C ++, ¡tienes que usar herencia múltiple! Lo que esto significa en la práctica es que todavía usas la herencia múltiple, pero limitas artificialmente para lo que te permites usarlo.

Ver el artículo anterior para una implementación de mixin real.