关于匿名类型:C#匿名实现接口(或抽象类)

C# anonymously implement interface (or abstract class)

本问题已经有最佳答案,请猛点这里访问。

在Java中,可以扩展一个与您可以即时实现的匿名类的接口。例子:

1
2
3
4
5
Runnable myRunnable = new Runnable()
{
    @Override
    public void run() { /**/ }
}

(更多关于:http://www. TECHARTIONTUR.COM/博客/ 2009 / 08 /匿名类在Java.html中ixZZ1K07MVIEO)

这在C中是可能的吗?如果不是,那么在不需要实施过多的子类的情况下,什么是可行的替代方案?


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

1
2
3
4
ThreadStart start = () =>
{
    // Do stuff here
};

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

1
ThreadStart start = MethodToRunInThread;

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

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

如果您确实需要实现一个接口,那么您必须真正实现它(可能是在一个私有的嵌套类中)。然而,在我的经验中,C语言并没有经常出现这种情况——通常C接口是自然的,即使在爪哇,也会自然而然地需要一个"真实"的实现。


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

不过,C中的另一种模式是使用工厂和委托的组合来允许接口的动态实现。本质上,工厂接受接口的每个方法的委托,并将它们用作支持实现。例如,这里有一个针对IComparable的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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));