c# - 实现逻辑的最佳方式,因此两个相似的类具有共同和不同的功能
问题描述
我正在尝试设置一个可以与 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 的部分功能。
解决方案
接口的意义在于,下一层可以使用接口的方法编写代码,而不必担心底层实现。您尝试做的事情首先使使用接口的意义无效。如果你需要调用类似的东西,putDataUsingXML()
那么调用者就会知道他们需要一个 NOSQL 风格的数据库,而不是一个 SQL 数据库。甚至你的变量名也是noSqlObj
. 那么创建一个声称隐藏这些细节的界面有什么意义呢?
如果你真的需要这样做,你可以将接口转换为底层实现。
((NoSqlManager)noSqlObj).putDatausingXML();
但是你真的应该重新评估你在这里想要完成的事情。
推荐阅读
- ios - 调整按钮大小以适应任何屏幕的约束 - Xcode swift
- android - 使用新版本的 Firebase 库时出现“无法访问 zzbfm”错误
- c - 具有 192 位和 256 位密钥的 AES-NI 内在函数
- floating-point - float 如何保证 7 位精度?
- jenkins-pipeline - 如何将 Jenkins 共享库中的类导入管道
- azure - 在应用服务计划中禁用用户/应用凭据部署
- windows - 如何将批处理文件添加到 Windows 上下文菜单中,该菜单在选择时以管理员身份从该位置运行?
- file-io - 在 SAS 的 PROC EXPORT 中使用 IP ADDRESS
- excel - 如何根据单元格值交替格式化excel
- c++ - 你如何从文件中读取 n 个字节并将它们放入向量中
使用迭代器?