Frage

Ich komme aus einer C ++ Hintergrund, wo ich Vorlage Mixins verwenden können, Code zu schreiben, zu FinalClass bezieht, die ein Template-Parameter, die in übergeben wird. Auf diese Weise können wiederverwendbare Funktionen „Mixed-in“ auf jede abgeleitete Klasse sein, indem man einfach erben von ReusableMixin mit einer Vorlage Paramter von MyFinalClass. Dies alles wird in die Klasse inlined so ist es, als ob ich nur eine große Klasse geschrieben, die alles tat - also sehr schnell! Da Mixins kann Kette, kann ich mische in allen möglichen Verhalten (und Staat) in ein Objekt zusammen.

Wenn jemand Klärung der Technik will, fragen Sie bitte. Meine Frage ist, wie kann ich so in C # Wiederverwendung bekommen? . Hinweis: C # Generika erlauben nicht von einem generischen Parameter vererben

War es hilfreich?

Lösung

In C #, in der Nähe erhalten Sie auf C ++ Stil Mixins ist die Mixins als Felder einer Klasse hinzufügen und eine Reihe von Weiterleitungsmethoden zur Klasse hinzufügen:

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

Dies ist in der Regel genug, wenn Sie nur die Funktionalität und Zustand des Mixins importieren mögen. Ein mixin kann natürlich implementiert werden, wie Sie möchten, komplett mit (privat) Felder, Eigenschaften, Methoden, etc.

Wenn Ihre Klasse muss auch Express „ist-a“ Beziehungen mit dem Mixins dann müssen Sie Folgendes tun:

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

interface IMixin2
{
    void Do2();
}

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

(Dies ist auch der normale Weg, wie Mehrfachvererbung in C # emuliert.)

Natürlich können die mixin Schnittstellen sowie die mixin Klassen Generika, z.B. mit den meisten abgeleitete Klasse Parameter oder was auch immer.

Andere Tipps

Sie können Schnittstellen und Erweiterungsmethoden verwenden. Zum Beispiel:

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

Nun können Sie die Mixins verwenden, indem Sie von MDoSomething vererben. Denken Sie daran, mit Erweiterungsmethoden innen (diese) Klasse erfordert die diese Qualifier. Zum Beispiel:

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.

In C # können Sie das „teilweise“ Schlüsselwort verwenden, um anzuzeigen, dass Ihre Klasse in mehreren Quelldateien implementiert. Sie können dann ein wenig Templat-Tool verwenden, um zusätzliche Quellcodedateien automatisch generieren, die die Methoden enthalten, die Sie in Ihrer Klasse injizieren wollen.

Das T4 Templating Werkzeug in Visual Studio enthalten ist, kann verwendet werden, das zu tun, sondern ein simpler Ansatz verwendet werden kann. Siehe meine eigene Template-Engine: http://myxin.codeplex.com/

Überprüfen Sie die Remix-Bibliothek für .net heraus http://remix.codeplex.com

Diese Bibliothek bringt Mixins zu .NET

Would Erweiterungsmethoden helfen in Ihrem Szenario?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top