我正在編寫一個應用程序,它需要開發一個引擎來處理數據,但引擎必須由另一個根據客戶的需要來替換。由於每個客戶都有非常不同的需求,我希望將每個引擎與其他引擎分開,因此我們只能使用客戶需要的引擎交付應用程序。實例化一個子類作爲父類,但調用孩子的方法
所以我的VS解決方案具有以下項目:應用程序,Engine_Base,Engine_A,Engine_B 應用程序= exe文件 Engine_Base =父類...編譯爲一個dll,並通過工程中的添加到應用程序的引用屬性 Engine_A和Engine_B都是Engine_Base的子類,並且都編譯爲自己的dll(Engine_A.dll,Engine_B.dll)。它們不會被添加到App的引用中,因此它們不會在運行時加載,因爲我們不想將它們都發送給所有客戶。
基於我們決定哪些發動機負荷客戶的配置文件:
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));
}
由於只有Engine_Base被添加到C++項目的引用我們投我們的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
我意識到這與繼承有關,但我對如何解決這個問題的想法不太瞭解。
有沒有人有如何解決這個問題的想法?
我們的方法是一個正確的解決方案,還是我們應該一直在尋找其他方法並以不同的方式做事?
我不能在C++中重現此問題。我用虛擬方法創建了一個抽象基類,還創建了兩個派生類。然後,我可以實例化派生類,並使用與用於執行指向虛方法基礎的委託相同的語法。 您可以發佈Engine_Base,Engine_A和Engine_B定義的相關部分嗎? – 2009-05-22 21:55:31
這是託管C++並將函數標記爲虛擬並沒有任何行爲影響。將基類標記爲虛擬會導致以下錯誤: 錯誤錯誤C2889:'Engine_Base':託管類類型不能是虛擬基類 – 2009-05-26 15:51:29