单一分派的问题对于使用静态类型语言(如Java和C# )编码的人来说最为熟悉。基本思想是:
而运行时多态性允许我们根据receiver的类型(运行时类型)分派到正确的方法调用,例如:
IAnimal mything = new Cat();
mything.chop();方法调用将根据mything的运行时类型,即Cat来执行。这就是单一分派功能(它存在于Java/C#中)。
现在,如果您不仅需要调度接收器的运行时类型,而且还需要调度(多个)参数的类型,那么您将面临一个小问题:
public class MyAcceptor {
public void accept (IVisitor vst) {...}
public void accept (EnhancedConcreteVisitor vst) {...}
}第二个方法永远不会被调用,因为在我们的“消费者”代码中,我们只是倾向于通过通用的超类型或接口来处理不同类型的对象(在我的例子中是访问者)。
这就是我为什么这么问的原因--因为动态类型允许多分派多态性,而C# 4.0就有这个动态关键字;)
发布于 2010-05-02 15:17:41
是的,动态类型允许多次分派--不,你不必创建自己的动态对象来做这件事。
假设我们想要自己实现Enumerable.Count(),并且我们不希望在代码中有大量的"if (source is IList)“测试。我们可以这样写:
public static class Enumerable
{
public static int Count<T>(this IEnumerable<T> source)
{
dynamic d = source;
return CountImpl(d);
}
private static int CountImpl<T>(ICollection<T> collection)
{
return collection.Count;
}
private static int CountImpl(ICollection collection)
{
return collection.Count;
}
private static int CountImpl<T>(string text)
{
return text.Length;
}
private static int CountImpl<T>(IEnumerable<T> source)
{
// Fallback
int count = 0;
foreach (T t in source)
{
count++;
}
return count;
}
}我不是说这是个好主意,但这就是它的工作方式:)
请注意,您需要小心,不要引入可能以某些类型的不明确调用结束的情况。使用类作为参数不是问题,但是考虑到单个类可以实现多个接口。
发布于 2010-05-02 14:01:24
可以,您可以创建执行任意复杂调度的DLR类型。查看http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx
https://stackoverflow.com/questions/2752523
复制相似问题