【发布时间】:2015-07-03 18:01:11
【问题描述】:
我正在构建一个名为Database 的纯虚函数类。这个想法是有一个类来处理所有数据库接口(即:open 和close),并且可以在我的业务层上使用。
Database 类将以多种“风格”实现,适用于不同的数据库,例如 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(需要所有这些变量来连接)。
我有一些关于实现的问题(我们以 oracle 为例):
a) 我是否需要在派生类头文件上再次重新声明虚拟方法,例如:
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);
}
b) 如何在派生类中构造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# 世界,如果这里有一些误解,我深表歉意。
【问题讨论】:
-
你研究过基于接口的设计模式吗? en.wikibooks.org/wiki/C%2B%2B_Programming/Code/…
-
我熟悉界面设计模式。我已经在 C# 中使用过它,这就是我想要完成的事情...我的疑问与 C++ 语法和如何实现的行为有关它,特别是具有不同的“打开”方法...
-
我建议在子类中将您的成员函数标记为
override,如:void open(const std::string databasename) override;如果您实际上没有覆盖任何内容,这将确保您收到编译器错误。 -
此外,像“open”/“close”和“require”/“release”这样的东西在 C++ 中最好留给 RAII
-
@Mendez:这就是 RAII 的意思,是的。
标签: c++ polymorphism virtual abstract pure-virtual