我目前有一个运行代码,用于通过给定的API(libpq)连接到数据库。
我基本上有两个类:主应用程序类CMain和与数据库相关的类(负责连接数据库,发出查询并存储结果),称为CDbConnectorPq。
在我的CMain构造函数中,我当前实例化类型为CDbConnectorPq的类成员,然后使用该对象直接从我的CMain对象触发该连接和查询:
main->dbConnectorPq->connect();
问题是,除了libpq,我现在需要实现另一个API以连接到数据库(ODBC)。我试图弄清将libpq代码与odbc代码分离的一种不错的建模方法,但仍使用与我的主要对象完全相同的接口(interface)。
我考虑过继承,但最终得到了2个类,即CDbConnectorPq和CDbConnectorODBC,然后在我的主体中现在有了两个成员:一个用于libpqxx,一个用于odbc,并被迫:
if ( gl_use_config_odbc )
dbConnectorOdbc = new CDbConnectorODBC();
else if ( gl_use_config_libpq )
dbConnectorPq = new CDbConnectorPq();
然后 :
if ( gl_use_config_odbc ) {
dbConnectorOdbc->connect();
dbConnectorOdbc->query();
}
else if ( gl_use_config_pq ) {
dbConnectorPq->connect();
dbConnectorPq->query();
}
在这里不知道如何利用继承来掩盖我的主要对象中特定于API的逻辑。
理想情况下,接口(interface)应该是(我认为):
(如果gl_use_config = PQ)
dbConnector-> setType(gl_use_config);
dbConnector-> connect(....);
dbConnector> connect(...);
或(如果gl_use_config = ODBC)
dbConnector-> setType(gl_use_config);
dbConnector-> connect(param1,param2);
dbConnector> connect(query1,query2);
因为是的,所以PQ和ODBC之间的参数编号在数量和类型上可能有所不同...
那么,在这种情况下,什么是智能建模呢?
最佳答案
我认为这样做的方法是让CMain类拥有两个子类都派生自的抽象基类的指针。例如。
class IDatabase
{
public:
virtual void connect() = 0;
[...]
};
然后,您唯一需要if / then逻辑的地方就是创建适当类的对象时:
if ( gl_use_config_odbc ) {
dbConnector = new CDbConnectorODBC();
} else {
dbConnector = new CDbConnectorPq();
}
之后的一切与之前相同:
dbConnector->connect();
...,并且C++虚拟方法查找机制将根据(dbConnector)指向的对象类型自动调用适当的方法。
至于不同的参数编号,请尝试将实现细节的代码保留在两个子类中,以便主代码不必担心它们。 CMain看到的IDatabase接口(interface)应该与实现无关。
关于c++ - 在C++中建模变量成员类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15671645/