アプリケーションアーキテクチャの障害になりました。ビジターパターンを使用して、実行時にわからないタイプの抽象オブジェクトに対して特定のアルゴリズムを実行し始めました。私の問題は、私のアルゴリズムがネストされた抽象型の型にも依存していることです。
私が何を意味するかを説明しましょう:
抽象DataSourceクラスがあります。これから、concereteDataSourceReferenceクラスとDataSourceExplicitクラスを実装します。また、抽象Reportクラス(逆シリアル化されたメタデータ)があり、そこから具体的なReportクラスReportTypeAおよびReportTypeBを実装します。これらのオブジェクトが作成されるとき、それらのDataSourceは任意の拡張DataSourceクラスである可能性があります。
それに応じて実行できるように、実際のレポートタイプとデータソースタイプの両方が必要です。ビジターパターンを使用してコンサートレポートタイプを取得できますが、後でDataSourceに対して同じことを行う方法がわかりません。
レポートにアクセスした後、データソースにアクセスできません。具体的なタイプのレポートを失うためです(基本のレポートタイプを受け入れる必要があるため:Accept(SomeDataSourceVisitor d、MetaReport m)-またはすべての可能なレポートタイプに対してオーバーロードします、これはビジターパターンの目的を無効にします。私の問題を参照してください。
何か案は?ディスパッチャ(訪問者)が新しいレポートをサポートしていることを確認するために新しいレポートタイプの開発者を必要としないため、動的な使用は避けたいと思います。
現在のコード:
public abstract class DataSource
{
}
public class DataSourceReference : DataSource
{
// reference thing(s)
}
public class DataSourceExplicit : DataSource
{
// explicit thing(s)
}
public abstract class Report
{
// some shared Report attribute(s)
// ...
public DataSource DataSource { get; set; }
public abstract FinalReport Execute(IReportExecutionDispatcher d);
}
public class ReportA : Report
{
// ReportA specific attribute(s)
// ...
public override Execute(IReportExecutionDispatcher d)
{
d.ExecuteReport(this);
}
}
public class ReportB : Report
{
// ReportB specific attribute(s)
// ...
public override Execute(IReportExecutionDispatcher d)
{
d.ExecuteReport(this);
}
}
public interface IReportExecutionDispatcher
{
FinalReport ExecuteReport(ReportA);
FinalReport ExecuteReport(ReportB);
}