Я строю класс с чистыми виртуальными функциями, называемый Database
. Идея состоит в том, чтобы иметь класс, который обрабатывает все интерфейсы базы данных (то есть: open
и close
) и может использоваться на моих бизнес-слоях.Как реализовать чистые виртуальные функции с различными структурами параметров
Класс базы данных будет реализован в нескольких «вариантах» для разных баз данных, таких как mySqlDatabase и OracleDatabase.
Я представил Database
имея чистые виртуальные методы с без кода - только заголовочный файл следующим образом:
Database.hpp
class Database {
public:
Database();
virtual ~Database();
virtual void open(const std::string databasename) = 0;
virtual void open(const std::string databasename, const std::string username, const std::string password) = 0;
virtual void open(const std::string databasename, const std::string schema, const std::string username, const std::string password) = 0;
.
<Other stuff>
.
}
Три open
вариации существуют, чтобы поддерживать различные требования подключения к базе данных , от простейшего (например, Sqlite3, которому требуется только имя файла), для Oracle (которому нужны все эти переменные для подключения).
У меня есть несколько вопросов по поводу реализации (давайте оракул, например):
а) Должен ли я должен снова переобъявить виртуальные методы в производном заголовочном файле класса, как:
class OracleDatabase : public Database {
public:
OracleDatabase();
virtual ~OracleDatabase();
void open(const std::string databasename);
void open(const std::string databasename, const std::string username, const std::string password);
void open(const std::string databasename, const std::string schema, const std::string username, const std::string password);
}
б) Как я могу структурировать реализацию методов open
в производном классе (возьмем Sqlite3)?
void Sqlite3Database::open(const std::string databasename){
...do some stuff...
}
void Sqlite3Database::open(const std::string databasename, const std::string username, const std::string password) {
...do some stuff...
}
void Sqlite3Database::open(const std::string databasename, const std::string schema, const std::string username, const std::string password) {
...do some stuff...
}
Я использую правильную стратегию? Я просматривал виртуальные и чистые виртуальные стратегии и считаю, что это лучший подход для моей проблемы.
Любые предложения/подсказки?
OBS: Я иду из мира C#, поэтому я извиняюсь, если здесь есть какое-то заблуждение.
Вы смотрели в интерфейс на основе шаблона дизайна? http://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Interface-based_Programming_.28IBP.29 –
Я знаком с шаблоном проектирования интерфейса. Я использовал его уже в C# и это то, что я хочу выполнить ... Мои сомнения связаны с синтаксисом C++ и поведением о том, как его реализовать, особенно имея разные «открытые» методы ... – Mendes
Я бы рекомендовал маркировать ваши функции-члены как 'override' в подклассе, как в: 'void open (const std :: string databasename) override;' Это гарантирует, что вы получите ошибку компилятора, если вы на самом деле ничего не переопределяете. –