纯抽象类和派生类型的实例化

Pure abstract classes and instantiation of derived types

本文关键字:实例化 类型 派生 抽象类      更新时间:2023-10-16

我想在大型的C 代码基础上改善编译时间,并散布着循环依赖关系。我决定使用主要使用纯抽象界面来减少循环依赖性,从而可以将项目分为较小的模块。

ibar.h:

struct IBar {
  IBar();
  virtual ~IBar();
  virtual void foo() = 0;
}
std::unique_ptr<IBar> createIBar();

bar.cpp:

#include "ibar.h"
class Bar : IBar {
  Bar();
  virtual ~Bar();
  virtual void foo() {<do stuff>;}  
}

现在,我的CreateIbar函数需要在某个地方定义。如果我在bar.cpp中定义它,那么使用ibar.h的任何人都需要在bar.o中链接,这是我要避免的。因此,我需要某种工厂,只能使用此接口才能适用于客户。

在我们的代码库中,我们已经在使用一种模式,在该模式中,我们创建了运行时的初始化器,该模式可以实例化派生类以履行接口的职责。这是由构建系统完成的,该系统识别基于固定模式的初始化器函数,这些功能通过Extern Int定义将其"链接到主应用程序中,因此应用程序启动时所有实例化。

我可以使用这种模式来创建一个工厂,该工厂只知道ibar,但我不喜欢它,因为它首先要在构建系统上施加额外的职责。其次,我想在以后的阶段使用懒惰的dll,这种模式有效地杀死了这一点。第三,由于这将使用很多组件来完成,因此一段时间后的工厂和初始调用列表将增长很大。

还有哪些其他可以照顾此用例的技术?

(回答我自己)抽象出厂模式用基本手柄创建派生的对象,我得出的结论是,这是我正在做的接口/实现分离工作的最佳补充。

讲故事的人建议的CRTP模式也可以发挥作用,如果您接受链接时间依赖关系到任何创建栏所需的bar。CRTP有助于静态多态性,因此可以将静态创建函数的调用传递到静态创建键函数,而常规多态性则是不可能的。我无法使用此模式避免链接时间依赖性。