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