C# anonymously implement interface (or abstract class)
本问题已经有最佳答案,请猛点这里访问。
在Java中,可以扩展一个与您可以即时实现的匿名类的接口。例子:
1 2 3 4 5 |
(更多关于:http://www. TECHARTIONTUR.COM/博客/ 2009 / 08 /匿名类在Java.html中ixZZ1K07MVIEO)
这在C中是可能的吗?如果不是,那么在不需要实施过多的子类的情况下,什么是可行的替代方案?
不,在C语言中不能这样做-但是通常的替代设计方法是使用委托。在您给出的示例中,
1 2 3 4 | ThreadStart start = () => { // Do stuff here }; |
或者,如果您只需要运行一个具有正确签名的方法,则可以使用方法组转换:
1 | ThreadStart start = MethodToRunInThread; |
号
或者在
1 2 |
如果您确实需要实现一个接口,那么您必须真正实现它(可能是在一个私有的嵌套类中)。然而,在我的经验中,C语言并没有经常出现这种情况——通常C接口是自然的,即使在爪哇,也会自然而然地需要一个"真实"的实现。
正如乔恩指出的,这在C中是不可能的。
不过,C中的另一种模式是使用工厂和委托的组合来允许接口的动态实现。本质上,工厂接受接口的每个方法的委托,并将它们用作支持实现。例如,这里有一个针对
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)); |
。