ここで説明されているように、dynamic キーワードを使用してビジター パターン (ダブル ディスパッチ) を実装する C# で記述されたクラス階層を拡張しています。
これは、私が現在 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 構文の動的型。これは可能ですか?