1

我正在扩展用 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 语法中的动态类型。这有可能吗?

4

0 回答 0