データを処理するためのエンジンの開発が必要なアプリケーションを作成していますが、エンジンは顧客のニーズに応じて別のものに置き換える必要がありました。顧客ごとに非常に異なるニーズがあったため、各エンジンを他のエンジンから分離して、顧客が必要とするエンジンでのみアプリケーションを提供できるようにしたいと考えました。
したがって、私の VS ソリューションには次のプロジェクトがあります: App、Engine_Base、Engine_A、Engine_B App = exe Engine_Base = 親クラス... dll にコンパイルされ、projec プロパティを通じて App の参照に追加されます Engine_A と Engine_B は両方ともEngine_Base の子クラスであり、両方とも独自の dll (Engine_A.dll、Engine_B.dll) にコンパイルされます。すべての顧客に両方を出荷したくないため、実行時に読み込まれないように、これらはアプリの参照には追加されません。
お客様の構成ファイルに基づいて、ロードするエンジンを決定します。
Engine_Base^ engine_for_app;
Assembly^ SampleAssembly;
Type^ engineType;
if (this->M_ENGINE == "A")
{
SampleAssembly = Assembly::LoadFrom("path\\Engine_A.dll");
engineType = SampleAssembly->GetType("Engine_A");
engine_for_app = static_cast<Engine_Base^>(Activator::CreateInstance(engineType, param1, param2));
}
else
{
SampleAssembly = Assembly::LoadFrom("path\\Engine_B.dll");
engineType = SampleAssembly->GetType("Engine_B");
engine_for_app = static_cast<Engine_Base^>(Activator::CreateInstance(engineType, param1, param2, param3, param4));
}
C++ プロジェクトの参照には Engine_Base のみが追加されるため、Engine__A または Engine_B オブジェクトを親型にキャストします。
次に、実行に時間がかかる (大量のデータを処理する) エンジンのスレッド実行のイベントを設定します。
engine_for_app->OnComplete += gcnew CompleteEngineProcess(this, &frmMain::ThreadChildComplete);
engine_for_app->OnProgressInit += gcnew ProgressInitEngine(this, &frmMain::ThreadChildProgressInit);
engine_for_app->OnProgressReport += gcnew ProgressReportEngine(this, &frmMain::ThreadChildProgressReport);
Thread^ aThread;
aThread = gcnew Thread(gcnew ThreadStart(engine_for_app, &Engine_Base::Read));
しかし、これは私に次のことを与えます:
Error 2 error C3754: delegate constructor: member function 'Engine_A::Read' cannot be called on an instance of type 'Engine_Base ^' d:\_activeWork\EDI_TRUNK\src\App\frmMain.cpp 492
これは継承に関係していることはわかっていますが、これを修正する方法についてのアイデアが不足しています。
誰もこれを修正する方法についてアイデアを持っていますか?
私たちのアプローチは適切な解決策でしょうか?それとも何か別のものを見て別の方法で行うべきだったのでしょうか?