我正在扩展用 C# 编写的类层次结构,该层次结构使用 dynamic 关键字实现访问者模式(双分派),如此处所述。
这是我目前在 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
专业化,所以我需要AcceptCommand()
像在 C# 中一样覆盖 C++/CLI 类中的方法以修复双重调度,但问题是我不知道如何执行Command
对象的强制转换为C++/CLI 语法中的动态类型。这有可能吗?