我目前有一个运行代码,用于通过给定的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/

10-10 10:39