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

20
2个回答

20
不,你不能在C#中这样做。但是通常的替代设计方法是使用委托。在你给出的例子中,Runnable通常使用ThreadStart表示,并且你可以使用匿名方法或lambda表达式:
ThreadStart start = () =>
{
    // Do stuff here
};

如果你只是想运行一个方法,并且方法的签名正确,那么你可以使用方法组转换:

ThreadStart start = MethodToRunInThread;

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

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

如果你真的需要实现一个接口,那么你必须真正地实现它(可能是在一个私有嵌套类中)。然而,在我的经验中,这种情况在C#中并不太常见 - 通常 C# 接口本来就会自然地要求一个“真正”的实现,即使在 Java 中也是如此。

1
这是我有时会想念的一个功能,特别是因为我的接口通常很窄(角色接口),并遵循接口隔离原则。如果我可以在DI配置中注册委托,而应用程序的其余部分仍然可以依赖于该接口(而不是Func<T>),而无需创建某种包装该委托并实现该接口的代理类,那将非常方便。 - Steven

8

正如Jon所指出的那样,在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));

非常酷,+1!但作为良好的实践,最好只滚动命名类。 - nawfal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接