C ++ / CLI是否等同于C#强制转换为动态类型?

时间:2016-12-07 03:53:59

标签: c# dynamic c++-cli visitor-pattern double-dispatch

我正在扩展一个用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对象转换为动态类型。这可能吗?

0 个答案:

没有答案