2009-05-22 75 views
0

我正在編寫一個應用程序,它需要開發一個引擎來處理數據,但引擎必須由另一個根據客戶的需要來替換。由於每個客戶都有非常不同的需求,我希望將每個引擎與其他引擎分開,因此我們只能使用客戶需要的引擎交付應用程序。實例化一個子類作爲父類,但調用孩子的方法

所以我的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 

我意識到這與繼承有關,但我對如何解決這個問題的想法不太瞭解。

有沒有人有如何解決這個問題的想法?

我們的方法是一個正確的解決方案,還是我們應該一直在尋找其他方法並以不同的方式做事?

+0

我不能在C++中重現此問題。我用虛擬方法創建了一個抽象基類,還創建了兩個派生類。然後,我可以實例化派生類,並使用與用於執行指向虛方法基礎的委託相同的語法。 您可以發佈Engine_Base,Engine_A和Engine_B定義的相關部分嗎? – 2009-05-22 21:55:31

+0

這是託管C++並將函數標記爲虛擬並沒有任何行爲影響。將基類標記爲虛擬會導致以下錯誤: 錯誤錯誤C2889:'Engine_Base':託管類類型不能是虛擬基類 – 2009-05-26 15:51:29

回答

0

編輯:也許請確保Engine_A等方法標記爲虛擬?