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中也是如此.
正如乔恩所指出的,这在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)
| 归档时间: |
|
| 查看次数: |
9605 次 |
| 最近记录: |