... классы - это все интерфейсные классы, которые будут реализованы в приложении ...
... PluginFactory
и ConflictResolver
используются только внутри класса PluginLoader
...
Это в основном означает, что, хотя они используются только для внутреннего использования, вы должны раскрыть существование PluginFactory
и ConflictResolver
, поскольку вам нужно, чтобы клиент реализовал их, а затем передатьпользовательские реализации для PluginLoader
некоторым образом (в данном случае через конструктор).
Однако можно избежать объявления именованного объекта на верхнем уровне (статическом или автоматическом внутри main
) (не уверенхотя почему-то хотелось бы сделать это), заменив ссылки указателями (предпочтительно умный вид, unique_ptr будет просто инструментом для работы):
class PluginLoader
{
public:
PluginLoader(
std::unique_ptr<Logger> logger,
std::unique_ptr<PluginFactory> plugin_factory,
std::unique_ptr<ConflictResolver> conflict_resolver
)
: logger(std::move(logger))
, plugin_factory(std::move(plugin_factory))
, conflict_resolver(std::move(conflict_resolver))
{
}
private:
std::unique_ptr<Logger> logger,
std::unique_ptr<PluginFactory> plugin_factory,
std::unique_ptr<ConflictResolver> conflict_resolver
};
и создайте PluginLoader
следующим образом:
PluginLoader plugin_loader(
std::unique_ptr<CustomLogger>(new CustomLogger(/* ... */))
std::unique_ptr<CustomPluginFactory>(new CustomPluginFactory(/* ... */))
std::unique_ptr<CustomConflictResolver>(new CustomConflictResolver(/* ... */))
);
, где CustomLogger
, CustomPluginFactory
и CustomConflictResolver
являются реализациями Logger
, PluginFactory
и ConflictResolver
соответственно.