Я не могу подобрать подходящее название вопроса для моей проблемы, если у вас есть лучший заголовок, пожалуйста, предложите, спасибо.
Я пытаюсь проиллюстрировать свой вопрос с помощью кода C ++ ниже,
// IObject.h
struct IObject
{
// other APIs are ignored
virtual ~IObject() = 0;
};
// Object.h
struct Object : IObject
{
~Object() override {}
};
// ComposedObjects.h
struct ComposedObjects
{
// Constructor used in production
ComposedObjects();
// Constructor used in test
// A IObject mock will be injected
ComposedObjects(std::unique_ptr<struct IObject> aObject);
std::unique_ptr<struct IObject> mObject;
};
// ComposedObjects.cpp
ComposedObjects::ComposedObjects()
: mObject(std::make_unique<Object>())
{
}
ComposedObjects::ComposedObjects(std::unique_ptr<IObject> aObject)
: mObject(std::move(aObject))
{
}
Вопросы:
- Хорошая идея - удалить конструктор
ComposedObjects::ComposedObjects()
из ComposedObjects
класс?
Мое основное намерение удалить конструктор ComposedObjects::ComposedObjects()
- следовать принципу единой ответственности, я считаю, что есть две обязанности для вышеуказанного класса ComposedObjects
:
- создание
IObject
. - Управление жизненным циклом
IObject
.
Однако, если создание std::unique_ptr<IObject>
перемещается в место, где создается ComposedObjects
, я заметил, что вызывающий абонент также должен знать конкретный класс Object
вместо I / F IObject
.
Насколько я понимаю, абстрактный шаблон фабрики не решает мою проблему, потому что Object
должен быть создан до ComposedObjects
конструкций.
Большое спасибо за помощь.