我正在扩展一个用C#编写的类层次结构,它使用动态关键字实现一个访问者模式(双重调度),如here所述。
以下是我目前在C#中所做的一些非常简化的伪代码:
public class Command {
...
}
public class RunCommand : Command {
...
}
public class Base {
...
// Double-dispatch interface
public virtual void AcceptCommand(Command command) {
HandleCommand((dynamic)command);
}
// Example of a specialization that handles a RunCommand
protected virtual void HandleCommand(RunCommand command) {
...
}
}
现在,当我扩展层次结构时,派生类可能需要处理基类不知道的新Command
特化。 在这种情况下,双重调度将失败(似乎动态重载解析在尝试匹配方法时不会遍历扩展类层次结构)。 有一个简单的解决方法(在之前的链接文章中有描述),它包括覆盖派生类的AcceptCommand()
方法(复制原始实现),如下所示:
public class Derived : Base {
// Override to allow double-dispatch to handle commands introduced by Derived
public override void AcceptCommand(Command command) {
HandleCommand((dynamic)command);
}
}
现在,最近我需要使用C ++ / CLI中实现的项目扩展层次结构,以方便(与非托管WIN32 API代码进行大量交互)。这个项目引入了几个Command
特化,所以我需要像在C#中一样覆盖C ++ / CLI类中的AcceptCommand()
方法,以便修复双重调度,但问题是 I不知道如何在C ++ / CLI语法中将Command
对象转换为动态类型。这可能吗?