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

pis*_*hio 19 c# anonymous-types

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

Runnable myRunnable = new Runnable()
{
    @Override
    public void run() { /**/ }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 19

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

ThreadStart start = () =>
{
    // Do stuff here
};
Run Code Online (Sandbox Code Playgroud)

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

ThreadStart start = MethodToRunInThread;
Run Code Online (Sandbox Code Playgroud)

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

Thread t = new Thread(MethodToRunInThread);
t.Start();
Run Code Online (Sandbox Code Playgroud)

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


Jar*_*Par 8

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

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

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

...

IComparable<Person> impl = CompareableFactory.Create<Person>(
  (left, right) => left.Age.CompareTo(right.Age));
Run Code Online (Sandbox Code Playgroud)