2

すべて、複数の SQL データベースを定期的にアタッチおよびデタッチする必要があるアプリケーションがあります。これらすべてのデータベースを反復可能なコレクションとして保持するクラスを作成したいと考えています。これを行うには、から継承してICollectionいますが、理解していない考えがあります:

class SqlDataBases : ICollection<SqlDb>
{
    private List<SqlDb> dbColl;

    public SqlDataBases()
    {
        dbColl = new List<SqlDb>();
    }

    // Add an index to the collection.
    public SqlDb this[int _nIndex]
    {
        get { return (SqlDb)dbColl[_nIndex]; }
        set { dbColl[_nIndex] = value; }
    }

    // et al.
}

public class DbEnumerator : IEnumerator<SqlDb>
{
    // ...
}

class SqlDb
{
    private string strMdfFullPath;
    private string strLdfFullPath;
    private bool bIsAttached;

    public SqlDb(string _strMdfFullPath, string _strLdfFullPath, bool _bIsAttached)
    {
        this.strMdfFullPath = _strMdfFullPath;
        this.strLdfFullPath = _strLdfFullPath;
        this.bIsAttached = _bIsAttached;
    }
}

ICollection私の質問は、「「Add」、「Contains」などのメソッドを自分で追加する必要があるのに、なぜ継承するのですか?それとも、 MSDNで提案されているように、自分でこれを行う必要がありますか?私は「C# in a一言で言えば」そしてこの質問は、この素晴らしい本で取り上げられていないことで際立っています.

申し訳ありませんが、ここで何かが足りないことはわかっています...

4

5 に答える 5

3

私の質問は、「「Add」、「Contains」などのメソッドを自分で追加する必要があるのに、なぜ ICollection から継承するのですか?

ICollection<T>インターフェイスです。実装する必要があるメンバーを指定するだけです。すでに実装されているものから派生させたい場合は、 を参照してCollection<T>ください。独自の特別な特性を持つ独自のコレクション データ構造を作成したい場合は、インターフェイスを自分で実装することになります。

正直に言うと、ここで独自のクラスが必要な理由が明確ではありませんList<SqlDb>。クライアント コードで直接使用しないのはなぜですか?

于 2012-03-01T12:10:28.933 に答える
3

List<SqlDb>直接使用することを考えたことはありますか?

SqlDataBases クラスによって何を得たいのか、私には明らかではありません。

直接使用できない場合は、 からの継承ではなく、List<SqlDb>継承を検討してください。List<SqlDb>ICollection<SqlDb>

于 2012-03-01T12:14:59.797 に答える
2

ICollection<> から継承する理由は、独自のカスタム コレクション タイプを作成するためです。次に、ICollection<> から継承したため、メソッドに ICollection<> の入力変数がある場合は、新しいカスタム コレクション型を渡すことができます。

あなたの場合、カスタム コレクションを作成する必要があるまで、単純に List<> を使用できます。

于 2012-03-01T12:22:56.820 に答える
2

インターフェイスは単なるスケルトンです。それらにはロジックは含まれておらず、すべてのメソッド、プロパティなどのシグネチャのみが含まれています。

インターフェース

于 2012-03-01T12:11:44.353 に答える
1

「「Add」などのメソッドを追加する必要があるのに、なぜ ICollection から継承するのか」への回答:

Add/Next などを必要としない/したくない場合は、ICollection を継承する必要はありません。

于 2012-03-01T12:22:26.507 に答える