[英]Preferable to embeb dependencies on interfaces or let that job to the concrete classes?
[英]Separation of Concerns: Create base library and remove dependencies on concrete classes
我們有一種情況,我們為應用程序開發DLL插件。 所有插件都有一組通用的源文件。 但是,我希望將它們分成一個基礎庫。 我們有以下實現,它們只是一個DLL項目的一部分:
// dllentry class
BaseImporter* spImporter = NULL;
extern BaseImporter* createImporterImplementation(const std::string& pDllFileName);
int __stdcall DllImportOpen(
const char* pDllFileName,
const char** ppImporterUniqueName,
const char** ppImporterVersion)
{
// method implementation in concrete class source file
spImporter = createImporterImplementation(pDllFileName);
(*ppImporterUniqueName) = spImporter->GetUniqueName();
(*ppImporterVersion) = spImporter->GetImporterVersion();
return (0);
}
// base importer class
class BaseImporter()
{
public:
const char* GetUniqueName() const {return mUniqueName.c_str();}
const char* GetImporterVersion() const {return mVersion.c_str();}
protected:
// some pure virtual methods here
}
// concrete class
class XImporter : BaseImporter()
{
// implement base importer
}
// resides in XImporter source file
BaseImporter* createImporterImplementation(
const std::string& dll_filename)
{
return new XImporter (dll_filename);
}
當一起構建為1個DLL時,此方法工作正常。 但是,我想將dllentry類和BaseImporter
到一個基礎庫中。 顯然,這將在編譯基礎庫時創建鏈接器錯誤,因為它將搜索createImporterImplementation
的實現。 如何很好地分離可與具體庫一起使用的基礎庫?
一種解決方案是后期綁定createImporterImplementation。 嘗試類似的操作(注意,完全未經測試,可能是錯誤的詳細信息)
// in base DLL:
BaseImporter* createImporterImplementation(
const std::string& dll_filename)
{
HMODULE h - LoadLIbrary (dll_filename.c_str());
BaseImporter* (*fn)() = GetProcAddress(h, CreateImporterImplementation);
return (*fn)();
}
然后在具體的進口商中:
__declspec(dllexport) BaseImporter* createImporterImplementation()
{
return new XImporter;
}
這能回答問題嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.