En ruby, la razón por la que Mixins no es de herencia múltiple es que la combinación de métodos mixin es una cosa única.Esto no sería un problema tan grande, excepto que los módulos y clases de Ruby están sujetos a modificaciones. Esto significa que si mezclas un módulo a tu clase, entonces agrega un método al módulo, el método no estará disponible para tu clase; donde si lo hicieras en el orden opuesto, lo haría.
Es como pedir un helado. Si obtienes virutas de chocolate y toffee como tu mezcla, y te vas con tu cono, qué tipo de cono de helado tienes no cambiará si alguien agrega rociados multicolores a la bandeja de chocolate en la tienda de helados. Su clase, el cono de helado, no se modifica cuando está el módulo de mixin, el depósito de salpicaduras. La siguiente persona que use ese módulo mixin verá los cambios.
Cuando include
un módulo en ruby, llama Module#append_features
en ese módulo, que agrega una copia de los métodos de ese módulo al includer una vez.
Herencia múltiple, según tengo entendido, es más como delegación. Si su clase no sabe cómo hacer algo, pregunta a sus padres. En un ambiente de clase abierta, los padres de una clase pueden haber sido modificados después de que se creó la clase.
Es como una relación padre-hijo RL. Es posible que tu madre haya aprendido a hacer malabarismos después de que naciste, pero si alguien te pide que hagas malabarismos y le pides que: te muestre cómo (cópialo cuando lo necesites) o lo haga por ti (delegación pura), entonces ella Podré en ese punto, aunque tú fuiste creado antes de que su habilidad para hacer malabarismos fuera.
Es posible que usted podría modificar un módulo de rubí 'incluir' a actuar más como herencia múltiple mediante la modificación Module#append_features
para mantener una lista de includers, y luego actualizarlos mediante la devolución de llamada method_added
, pero esto sería un gran cambio desde Ruby estándar, y podría causar problemas importantes al trabajar con otros códigos. Es posible que sea mejor crear un método Module#inherit
que llame al include
y manejar la delegación también.
En cuanto a un ejemplo del mundo real, Enumerable
es impresionante. Si define #each
e incluye Enumerable
en su clase, eso le da acceso a toda una serie de iteradores, sin tener que codificar todos y cada uno.
Es divertido ver las etiquetas [independiente del idioma] y [ruby] sentadas una al lado de la otra como si fueran las mejores amigas =) – Oli
así Ruby provocó la pregunta, pero Mixin y los rasgos se pueden hacer en otros idiomas, como es más un patrón Supongo que –