4

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

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

4

5 回答 5

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) 类中使用扩展方法需要 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。

于 2009-01-05T09:29:48.793 回答
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();
    }
}

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

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

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

interface IMixin2
{
    void Do2();
}

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

(这也是 C# 中模拟多重继承的标准方式。)

当然,mixin 接口和mixin 类可以是泛型的,例如具有最派生类参数或其他。

于 2009-01-05T08:12:00.667 回答
2

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

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

于 2010-01-10T13:23:39.393 回答
1

在http://remix.codeplex.com上查看 .net 的混音库

这个库为 .NET 带来了 mixins

于 2011-04-26T06:06:40.447 回答
0

扩展方法对您的场景有帮助吗?

于 2009-01-05T06:19:47.880 回答