人们如何在C#中使用mixin风格的重用?

时间:2009-01-05 06:04:48

标签: c# c++ generics code-reuse template-mixins

我来自C ++背景,我可以使用模板mixins来编写引用FinalClass的代码,这是一个传入的模板参数。这允许可重用​​函数“混入”任何派生类,只需简单使用MyFinalClass的模板参数从ReusableMixin继承。这一切都被内联到课堂中,所以就好像我只是写了一个大课程来做所有事情 - 即非常快!由于mixins可以链接,我可以将各种行为(和状态)混合到一个对象中。

如果有人想澄清这项技术,请询问。我的问题是,如何在C#中重用?注意:C#泛型不允许从泛型参数继承。

5 个答案:

答案 0 :(得分:12)

您可以使用接口和扩展方法。例如:

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

现在您可以通过继承MDoSomething来使用mixins。请记住,在(this)类中使用扩展方法需要使用此限定符。例如:

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。

答案 1 :(得分:4)

在C#中,最接近C ++风格的mixins是将mixins添加为类的字段,并向该类添加一堆转发方法:

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

如果您只想导入功能,这通常就足够了。 mixin的状态。 mixin当然可以随你实现,包括(私有)字段,属性,方法等。

如果您的班级还需要表达与mixin的“is-a”关系,那么您需要执行以下操作:

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

interface IMixin2
{
    void Do2();
}

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

(这也是在C#中如何模拟多重继承的标准方法。)

当然,mixin接口以及mixin类可以是泛型,例如,使用派生最多的类参数或其他任何内容。

答案 2 :(得分:2)

在C#中,您可以使用“partial”关键字来指示您的类是在多个源文件中实现的。然后,您可以使用一个小模板工具自动生成其他源代码文件,其中包含您要在类中注入的方法。

Visual Studio中包含的T4模板工具可用于执行此操作,但可以使用更简单的方法。看看我自己的模板引擎:http://myxin.codeplex.com/

答案 3 :(得分:1)

http://remix.codeplex.com

上查看.net的混音库

这个库将mixins带到了.NET

答案 4 :(得分:0)

扩展方法会对您的方案有所帮助吗?