【发布时间】:2018-06-19 15:57:59
【问题描述】:
我正在创建一个数据库接口并有两个不同的数据库实现来使用这个接口
例如:
class DBOptions {
protected:
DBOptions();
};
class SQLliteDBOptions : public DBOptions { bool verySpecificSQLiteOption; };
class MySQLDBOptions : public DBOptions{ bool verySpecificMySQLOption; };
class DBIface {
public:
enum FileMode {
READ = 1,
WRITE = 2,
READWRITE = 3
};
public:
virtual bool connect(char * filename, DBIface::FileMode mode, DBOptions * opt) = 0;
virtual bool disconnect() = 0;
};
class SQLiteDB : public DBIface {
public:
bool connect(char * filename, DBIface::FileMode mode, SQLliteDBOptions * options)
{ std::cout << "connect form sqlite\n"; }
bool disconnect() { std::cout << "disconnect from sqlite\n"; }
};
class MySQLDB : public DBIface {
public:
bool connect(char * filename, DBIface::FileMode mode, MySQLDBOptions * options)
{ std::cout << "connect form mysql\n"; }
bool disconnect() { std::cout << "disconnect from mysql\n"; }
};
int main() {
DBIface * sqlitedb = new SQLiteDB();
SQLliteDBOptions * opt = new SQLliteDBOptions();
sqlitedb->connect("file", DBIface::READ, opt);
return 0;
}
两个派生类中的方法connect 不被视为父类中纯方法的实现。我应该怎么做才能解决这个问题?
我希望我的班级接受正确的数据库选项实例。我想我可以将 DB 选项动态转换为我需要的类型,但我想这不是最好的解决方案。
我应该创建一个 setter 方法来为每个 DB 实现设置 DB 选项吗?
【问题讨论】:
-
这是一个经典问题。没有通用的好解决方案。一种常见的解决方案是使 DBIface 成为由 dbOptions 类型参数化的模板。另一种是动态演员表。一个二传手比任何一个恕我直言。
-
另一种选择是从
DBIface中删除connect,将其作为独立方法留在子类中。由于connect无论如何都不能调用DBIface引用,因此不会丢失功能。
标签: c++ inheritance polymorphism