Чистый виртуальный интерфейс в C ++ примерно аналогичен интерфейсу в управляемом языке, таком как C# или Java:
struct DatabaseInterface {
virtual ~DatabaseInterface();
virtual std::string get(std::string key) = 0;
virtual void put(const std::string& key, const std::string& value) = 0;
};
Класс, зависящий от базы данных, может зависеть от указателя на абстрактный базовый класс. Ему не нужно ничего знать о реализации:
struct BusinessRules {
std::unique_ptr<DatabaseInterface> db; // reference
BusinessRules(std::unique_ptr<DatabaseInterface>);
/* stuff using the database interface */
};
И хотя вы не можете создать это непосредственно, вы можете иметь другой класс, наследующий интерфейс, и вы можете передать экземпляр конкретного класса потребителю, который ожидает указатель на интерфейс абстрактного класса:
struct SpecificDatabaseAccess: public DatabaseInterface {
SpecificDatabaseAccess(const std::string& connectionString);
std::string get(std::string key) override;
void put(const std::string& key, const std::string& value) override;
};
/* ... */
// dependency injection through the constructor
auto db = std::make_unique<SpecificDatabaseAccess>("...");
auto rules = BusinessRules(std::move(db));
Стандартная библиотека делает нечто подобное с istream
. istream
имеет несколько методов, которые работают поверх элемента streambuf
более низкого уровня. streambuf
является абстрактным интерфейсом, реализации которого обеспечивают доступ ввода / вывода (к stdin, файлам , строкам , et c).
Пока ничего из этого напрямую относится к чистой архитектуре, поэтому вы можете сделать реализации вашего компонента независимыми от их зависимостей.