我正在尝试建立一个数据库访问层,该层可以与SQL db以及一些noSQL DB进行通信。我正在考虑拥有一个像IDataManager这样的接口,该接口具有诸如GetData(),putData(),addTable(),dropTable()之类的通用功能,并且两个Db都可以具有独立的功能,例如noSQL DB可以允许从XML或平面插入数据文件等 我该如何在客户端代码中为这种层次结构实现工厂逻辑或访问逻辑?
interface IdataManager
{
getData();
putData();
addTable();
dropTable();
}
class NoSQLManager : Idatamanager
{
//implements all common functions
getData();
putData();
addTable();
dropTable();
//also declares some additional ones
putDatausingXML();
}
class SQLManager : Idatamanager
{
//implements all common functions
getData();
putData();
addTable();
dropTable();
//also declares some additional ones
putDatausinglocaltable();
}
//Now in my code to access above DAL logic , lets say I create a simple factory
class dataAccessFactory
{
IdataManager getDataManager(int id)
{
dataManager dm = null;
if(id==1)
dm = new NoSQLManager();
else if(id==2)
dm = new SQLManager();
return dm;
}
}
Logic to access above factory :
dataAccessFactory daf = new dataAccessFactory ();
IdataManager noSqlObj = daf.getDataManager(1);
noSqlObj.putDatausingXML(); //problem this wont work.
我希望能够使用noSqlObj访问诸如putDatausingXML之类的额外功能以及诸如getData()之类的常用功能
但是使用给定的继承和逻辑,我将只能访问基本接口IdataManager的一部分的功能。
答案 0 :(得分:0)
接口的重点是使下一层可以使用接口的方法编写代码,而不必担心基础实现。您试图做的事情首先使使用接口无效。如果您需要调用putDataUsingXML()
之类的东西,则调用者会意识到他们需要一个NOSQL风格的数据库,而不是SQL数据库。甚至您的变量名都是noSqlObj
。那么创建一个旨在隐藏这些细节的界面有什么意义呢?
如果确实需要执行此操作,则可以将接口转换为基础实现。
((NoSqlManager)noSqlObj).putDatausingXML();
但是您应该真正在这里重新评估您要完成的工作。