Pregunta

Vengo de un fondo de C ++ en el que puedo usar mixins de plantillas para escribir código que hace referencia a FinalClass, que es un parámetro de plantilla que se pasa. Esto permite que las funciones reutilizables se mezclen en " a cualquier clase derivada, simplemente heredando de ReusableMixin con un parámetro de plantilla de MyFinalClass. Todo esto se inscribe en la clase, así que es como si acabara de escribir una gran clase que hizo todo, ¡es decir, muy rápido! Como los mixins se pueden encadenar, puedo combinar todo tipo de comportamiento (y estado) en un objeto.

Si alguien quiere una aclaración sobre la técnica, por favor pregunte. Mi pregunta es, ¿cómo puedo reutilizarme así en C #? Nota: los genéricos de C # no permiten la herencia de un parámetro genérico.

¿Fue útil?

Solución

En C #, lo más cercano a los mixins de estilo C ++ es agregar los mixins como campos de una clase y agregar un montón de métodos de reenvío a la clase:

public class MyClass
{
    private readonly Mixin1 mixin1 = new Mixin1();
    private readonly Mixin2 mixin2 = new Mixin2();

    public int Property1
    {
        get { return this.mixin1.Property1; }
        set { this.mixin1.Property1 = value; }
    }

    public void Do1()
    {
        this.mixin2.Do2();
    }
}

Esto suele ser suficiente, si solo desea importar funcionalidad & amp; Estado de los mixins. Por supuesto, una combinación se puede implementar como desee, completa con campos (privados), propiedades, métodos, etc.

Si tu clase también necesita expresar " es-a " Para las relaciones con los mixins, debes hacer lo siguiente:

interface IMixin1
{
    int Property1 { get; set; }
}

interface IMixin2
{
    void Do2();
}

class MyClass : IMixin1, IMixin2
{
    // implementation same as before
}

(Esta es también la forma estándar en que se emula la herencia múltiple en C #).

Por supuesto, las interfaces de mezcla así como las clases de combinación pueden ser genéricas, por ejemplo. con un parámetro de clase más derivado o lo que sea.

Otros consejos

Podrías usar interfaces y métodos de extensión. Por ejemplo:

public interface MDoSomething // Where M is akin to I
{
     // Don't really need any implementation
}

public static class MDoSomethingImplementation
{
     public static string DoSomething(this MDoSomething @this, string bar) { /* TODO */ }
}

Ahora puede usar los mixins heredando de MDoSomething. Recuerde, el uso de métodos de extensión dentro de esta clase requiere el calificador this. Por ejemplo:

public class MixedIn : MDoSomething
{
    public string DoSomethingGreat(string greatness)
    {
         // NB: this is used here.
         return this.DoSomething(greatness) + " is great.";
    }
}

public class Program
{
    public static void Main()
    {
        MixedIn m = new MixedIn();
        Console.WriteLine(m.DoSomething("SO"));
        Console.WriteLine(m.DoSomethingGreat("SO"));
        Console.ReadLine();
    }
}

HTH.

En C #, puedes usar " parcial " palabra clave para indicar que su clase se implementa en varios archivos de origen. Luego, puede usar una pequeña herramienta de creación de plantillas para generar automáticamente archivos de código fuente adicionales que contienen los métodos que desea inyectar en su clase.

La herramienta de plantilla T4 incluida en Visual Studio se puede usar para hacer eso, pero se puede usar un enfoque más simplista. Ver mi propio motor de plantillas: http://myxin.codeplex.com/

Consulte la biblioteca de remix para .net en http://remix.codeplex.com

Esta biblioteca trae los mixins a .NET

¿Ayudarían los métodos de extensión en su escenario?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top