Question

Je viens d'un arrière-plan C ++ dans lequel je peux utiliser des mixins de modèles pour écrire du code faisant référence à FinalClass, un paramètre de modèle transmis. Cela permet aux fonctions réutilisables d'être "mélangées". à n'importe quelle classe dérivée, en héritant simplement de ReusableMixin avec un paramètre de modèle de MyFinalClass. Tout cela est intégré dans la classe, alors c'est comme si je venais d'écrire une grande classe qui faisait tout - c'est-à-dire très vite! Puisque les mixins peuvent chaîner, je peux mélanger toutes sortes de comportements (et d’états) dans un seul objet.

Si vous souhaitez des éclaircissements sur la technique, veuillez demander. Ma question est la suivante: comment puis-je me réutiliser comme ça en C #? Remarque: les génériques C # n'autorisent pas l'héritage d'un paramètre générique.

Était-ce utile?

La solution

En C #, le plus proche des mixins de style C ++ est de les ajouter en tant que champs d'une classe et d'ajouter de nombreuses méthodes de transfert à la classe:

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

Cela suffit généralement si vous souhaitez uniquement importer les fonctionnalités & amp; état des mixins. Un mixin peut bien sûr être implémenté à votre guise, avec des champs (privés), des propriétés, des méthodes, etc.

Si votre classe a également besoin d'exprimer "is-a" relations avec les mixins alors vous devez faire ce qui suit:

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

interface IMixin2
{
    void Do2();
}

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

(C’est également la méthode standard utilisée pour émuler l’héritage multiple en C #.)

Bien entendu, les interfaces mixin ainsi que les classes mixin peuvent être génériques, par exemple. avec un paramètre de classe le plus dérivé ou autre.

Autres conseils

Vous pouvez utiliser des interfaces et des méthodes d'extension. Par exemple:

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 */ }
}

Vous pouvez maintenant utiliser les mixins en héritant de MDoSomething. N'oubliez pas que l'utilisation de méthodes d'extension dans (cette) classe nécessite le qualificatif this. Par exemple:

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 #, vous pouvez utiliser l'option "partielle". mot-clé pour indiquer que votre classe est implémentée dans plusieurs fichiers source. Vous pouvez ensuite utiliser un petit outil de modélisation pour générer automatiquement des fichiers de code source supplémentaires contenant les méthodes que vous souhaitez injecter dans votre classe.

L'outil de modélisation T4 inclus dans Visual Studio peut être utilisé à cette fin, mais une approche plus simpliste peut être utilisée. Voir mon propre moteur de modèles: http://myxin.codeplex.com/

Découvrez la bibliothèque de remix pour .net sur http://remix.codeplex.com

Cette bibliothèque apporte les mixins à .NET

Les méthodes d'extension aideraient-elles votre scénario?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top