这不应该难以回答,但我非常绝望和困惑。我创建了用于从数据库执行读取查询的接口
interface IDatabase
{
DataTable ExecuteReaderCommand(IDbCommand command);
IDbCommand GetNewCommand();
}
接下来,我在接口上创建了两个不同的类实现。
class MysqlDatabase : IDatabase
{
public DataTable ExecuteReaderCommand(MySqlCommand command)
{
DataTable dt = new DataTable();
// ... read db
return dt;
}
public MySqlCommand GetNewCommand()
{
cnn.Open();
return cnn.CreateCommand();
}
}
和
class SQLiteDatabase : IDatabase
{
String dbConnection;
SQLiteConnection cnn;
public DataTable ExecuteReaderCommand(SQLiteCommand command)
{
DataTable dt = new DataTable();
// ... read db
return dt;
}
public SQLiteCommand GetNewCommand()
{
cnn.Open();
return cnn.CreateCommand();
}
}
但是我收到这些类没有实现IDatabase接口的错误:
MysqlDatabase does not implement interface member 'Database.GetNewCommand()'
MysqlDatabase.GetNewCommand() cannot implement 'Database.GetNewCommand()' because it does not have the matching return type of 'System.Data.IDbCommand'.
SQLiteDatabase does not implement interface member Database.ExecuteReaderCommand(System.Data.IDbCommand)
SQLiteDatabase does not implement interface member 'Database.GetNewCommand()'. SQLiteDatabase.GetNewCommand() cannot implement Database.GetNewCommand() because it does not have the matching return type of 'System.Data.IDbCommand'.
当我查看SQLiteCommand
和MySqlCommand
时,他们都会实现IDbCommand
。
如何在常用界面下使用这些类,以便我们轻松切换它们?
我非常感谢任何答案。
答案 0 :(得分:4)
当我查看SQLiteCommand和MySqlCommand时,它们都实现了IDbCommand
不,他们没有。他们声称他们这样做,但他们实际上并没有提供正确的方法。看看IDatabase.GetNewCommand()
:
IDbCommand GetNewCommand();
和您的实施:
public MySqlCommand GetNewCommand()
{
...
}
他们有不同的回报类型。同样,ExecuteReaderCommand
方法参数在IDbCommand
中为IDatabase
,在MySqlCommand
中为MysqlDatabase
。
选项:
对“弱类型”版本使用显式接口实现,在具体类上公开“强类型”版本。这就是SqlCommand
在.NET框架中的作用,例如。
使IDatabase
在其创建和使用的命令类型中具有通用性:
public interface IDatabase<TCommand> where TCommand : IDbCommand
{
DataTable ExecuteReaderCommand(TCommand command);
TCommand GetNewCommand();
}