1

これは答えるのが難しいことではありませんが、私はとても必死で混乱しています。データベースから読み取りクエリを実行するためのインターフェイスを作成しました

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

次に、インターフェイスの上に実装された2つの異なるクラスを作成しました。

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

1 に答える 1

4

SQLiteCommandとMySqlCommandを見ると、どちらもIDbCommandを実装しています。

いいえ、そうではありません。彼らはそう主張しているが、実際には正しい方法を提供していない。見てくださいIDatabase.GetNewCommand()

IDbCommand GetNewCommand();

とあなたの実装:

public MySqlCommand GetNewCommand()
{
    ... 
}

さまざまな返品タイプがあります。同様に、ExecuteReaderCommandメソッドパラメータはIDbCommandにありますIDatabaseMySqlCommand、にありMysqlDatabaseます。

オプション:

  • 「弱い型」バージョンには明示的なインターフェース実装を使用し、「強い型」バージョンを具象クラスに公開します。これはSqlCommand、たとえば.NETFrameworkで行われることです。

  • IDatabase作成および使用するコマンドのタイプを汎用化します。

    public interface IDatabase<TCommand> where TCommand : IDbCommand
    {
        DataTable ExecuteReaderCommand(TCommand command);
        TCommand GetNewCommand();
    }
    
于 2012-07-24T17:25:08.997 に答える