2012-07-24 59 views
1

这不应该很难回答,但我非常绝望和困惑。我做了执行从数据库读取查询的接口实现接口的MySql和SQlite类

interface IDatabase 
{ 
    DataTable ExecuteReaderCommand(IDbCommand command); 
    IDbCommand GetNewCommand(); 
} 

接下来,我在接口上面创建了两个不同的类implemetnig。

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'. 

当我看就SQLiteCommandMySqlCommand他们都实现了IDbCommand

如何在通用界面下使用这些类,以便轻松切换它们?

我非常感谢任何答案。

回答

4

当我看就SQLiteCommand和MySqlCommand将他们都器具IDbCommand的

不,他们没有。他们声称他们这样做,但他们实际上并没有提供正确的方法。看看IDatabase.GetNewCommand()

IDbCommand GetNewCommand(); 

和您的实现:

public MySqlCommand GetNewCommand() 
{ 
    ... 
} 

他们有不同的返回类型。同样,您的ExecuteReaderCommand方法参数在IDatabase中,但MySqlCommandMysqlDatabase中。

选项:

  • 使用的“弱类型”的版本显式接口实现,露出的混凝土类“强类型”的版本。例如,这就是.NET框架中的SqlCommand

  • 制作IDatabase通用的命令的类型是创建和使用:

    public interface IDatabase<TCommand> where TCommand : IDbCommand 
    { 
        DataTable ExecuteReaderCommand(TCommand command); 
        TCommand GetNewCommand(); 
    } 
    
+1

选项1正是我想做的事。你能指点我正确的方向怎么做?我需要用于MysqLCommand和SQLiteCommand的通用界面。我认为这是IDbCommand。 – 2012-07-24 17:31:35