我有一个应用程序,我正在对一系列元素执行操作,并且操作的确切性质取决于正在操作的元素的类型。由于封装的原因,不适合由元素来实现操作;这意味着它不能是元素类型的虚拟方法,因此“标准”多态性不起作用。我提出了一个与此相关的先前问题,并被告知这被称为访问者模式。
我以前总是使用if/elseif
基于对象类型的调度程序方法来实现这一点,然后调用适当的实现。dynamic
然而,最近,我注意到使用关键字可以完成同样的事情,如下所示:
private void ReconcileTips()
{
foreach (var step in _definition.Steps)
{
ReconcileTips((dynamic)step);
}
}
private void ReconcileTips(IBulkDispenseDefinition bulkDispense)
{
bulkDispense.TipType = ReconcileTip(bulkDispense.TipType);
}
private void ReconcileTips(ImportScreenDefinition importScreen)
{
foreach (var usage in importScreen.ReagentUsages)
usage.TipType = ReconcileTip(usage.TipType);
}
private void ReconcileTips(BuildScreenDefinition buildScreen)
{
foreach (var function in buildScreen.Functions)
function.TipType = ReconcileTip(function.TipType);
}
类似的模式可用于与类结构平行的其他操作,例如为_definition.Steps
. 想法是编译器基本上将其转换为if/elseif
我之前编写的相同逻辑,从而节省了我的精力。所以,有几个问题:
动态调度有什么我没有考虑过的问题吗?我相信这相当于执行一系列
if (x is TypeA) Do((TypeA)x) else...
,但我可能是错的。这实际上比长
if/elseif
方法更清洁、更容易理解吗?