我有一个关于多态类依赖注入最佳实践的问题,涉及到IT技术。我是C++的新手,请谅解如果我的问题很简单。假设我有一个Runner类,它需要接收两个对象:Logger和Worker。Logger是一个抽象类,有两个子类:FileLogger和SocketLogger。同样地,Worker也是一个抽象类,有两个子类:ApproximateWorker和CompleteWorker。
Runner类将在main()函数中创建,并根据配置文件或类似的东西创建Logger和Worker。我在SO和其他地方阅读了很多文章,通常的建议是优先使用栈分配的对象,并通过引用传递它们。然而,我不太确定如何动态地创建这些对象。如果使用堆分配的对象,我可以做以下操作:
Logger* log;
Worker* worker;
if (/*user wants a file logger*/ {
log = new FileLogger();
} else {
log = new SocketLogger();
}
if (/* user wants an approximate worker*/) {
worker = new ApproximateWorker();
} else {
worker = new CompleteWorker();
}
Runner runner = Runner(log, worker);
runner.run();
因为我只是在堆栈上存储指针,所以可以独立处理Logger和Worker的不同情况。如果使用堆栈分配的对象,则唯一能想到的方法是:
if (/*file logger and approx worker*/) {
FileLogger log();
ApproximateWorker worker();
Runner runner = Runner(log, worker);
} else if (/*file logger and complete worker*/) {
FileLogger log();
CompleteWorker worker();
Runner runner = Runner(log, worker);
} else if (/*socket logger and approx worker*/) {
SocketLogger log();
ApproximateWorker worker();
Runner runner = Runner(log, worker);
} else {
SocketLogger log();
CompleteWorker worker();
Runner runner = Runner(log, worker);
}
显然,如果要传入两个以上的对象,或者每个对象有两个以上的子类,这将很快变得荒谬。我的理解是,对象切片将防止您执行类似于第一个代码片段的操作。
我是否漏掉了什么明显的东西?还是应该使用动态内存(当然要使用智能指针)?