C#匿名实现接口(或抽象类)

在Java中,可以使用可以动态实现的匿名类扩展接口。 例:

Runnable myRunnable = new Runnable() { @Override public void run() { /**/ } } 

(更多信息: http : //www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO )

这可能在C#中吗? 如果没有,什么是可行的替代方案,而不必依赖于实现过多的子类?

不,你不能在C#中做到这一点 – 但通常替代设计方法是使用委托代替。 在您给出的示例中, Runnable通常使用ThreadStart表示,您可以使用匿名方法或lambda表达式:

 ThreadStart start = () => { // Do stuff here }; 

或者,如果您只是使用正确的签名运行方法,则可以使用方法组转换:

 ThreadStart start = MethodToRunInThread; 

或者在Thread构造函数中调用:

 Thread t = new Thread(MethodToRunInThread); t.Start(); 

如果你真的需要实现一个接口,你必须真正实现它(可能在一个私有嵌套类中)。 但是,根据我的经验,这在C#中并不常见 – 通常C#接口无论如何都要求“真正的”实现,即使在Java中也是如此。

正如乔恩所指出的,这在C#中是不可能的。

C#中的一种替代模式是使用工厂和委托的组合来允许接口的实时实现。 本质上,工厂为接口的每个方法接受委托,并将它们用作后备实现。 例如,这是IComparable的版本。

 public static class ComparableFactory { private sealed ComparableImpl : IComparable { internal Func _compareFunc; public int Compare(T left, T right) { return _compareFunc(left, right); } } public IComparable Create(Func compareFunc) { return new ComparableImpl() { _compareFunc = compareFunc }; } } ... IComparable impl = CompareableFactory.Create( (left, right) => left.Age.CompareTo(right.Age));