我来自C ++背景,我可以使用模板mixins来编写引用FinalClass的代码,这是一个传入的模板参数。这允许可重用函数“混入”任何派生类,只需简单使用MyFinalClass的模板参数从ReusableMixin继承。这一切都被内联到课堂中,所以就好像我只是写了一个大课程来做所有事情 - 即非常快!由于mixins可以链接,我可以将各种行为(和状态)混合到一个对象中。
如果有人想澄清这项技术,请询问。我的问题是,如何在C#中重用?注意:C#泛型不允许从泛型参数继承。
答案 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)
这个库将mixins带到了.NET
答案 4 :(得分:0)
扩展方法会对您的方案有所帮助吗?