一連の要素に対して操作を実行しているアプリケーションがあり、操作の正確な性質は操作対象の要素のタイプによって異なります。カプセル化の理由から、要素が操作を実装することは適切ではありません。これは、要素型の仮想メソッドにすることはできないため、「標準」ポリモーフィズムは機能しないことを意味します。これに関連する以前の質問を提出したところ、これはビジター パターンとして知られていると知らされました。
if/elseif
以前は、オブジェクトの型に基づいたディスパッチャ メソッドを使用してこれを実装し、適切な実装を呼び出していました。dynamic
しかし最近、次のようにキーワードを使用して同じことが達成できることに気付きました。
private void ReconcileTips()
{
foreach (var step in _definition.Steps)
{
ReconcileTips((dynamic)step);
}
}
private void ReconcileTips(IBulkDispenseDefinition bulkDispense)
{
bulkDispense.TipType = ReconcileTip(bulkDispense.TipType);
}
private void ReconcileTips(ImportScreenDefinition importScreen)
{
foreach (var usage in importScreen.ReagentUsages)
usage.TipType = ReconcileTip(usage.TipType);
}
private void ReconcileTips(BuildScreenDefinition buildScreen)
{
foreach (var function in buildScreen.Functions)
function.TipType = ReconcileTip(function.TipType);
}
の各要素のビュー モデルを作成するなど、クラス構造と並行して他の操作に同様のパターンを使用できます_definition.Steps
。コンパイラは基本的にこれをif/elseif
以前に書いたのと同じロジックに変換し、労力を節約できると考えています。それで、いくつか質問があります:
私が考慮していない動的ディスパッチに関する落とし穴はありますか? これは一連の を実行するのと同じ
if (x is TypeA) Do((TypeA)x) else...
だと思いますが、間違っている可能性があります。if/elseif
これは実際には長い方法よりもクリーンで理解しやすいですか?