Основы класса .NET ICollection - PullRequest
2 голосов
/ 01 марта 2012

Все, у меня есть приложение, которое должно регулярно подключать и отключать несколько баз данных 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, когда вам нужно добавить такие методы?как «Добавить», «Содержит» и т. д. Или вы должны сделать это самостоятельно, как предложено в MSDN ? Я читал «C # в двух словах», и этот вопрос стоит без вниманияв этой великой книге.

Прошу прощения, я знаю, что здесь что-то упущено ...

Ответы [ 5 ]

3 голосов
/ 01 марта 2012

Думали ли вы об использовании List<SqlDb> напрямую?

Для меня не очевидно, что вы надеетесь получить с помощью класса SqlDataBases.

Если вы не можете использовать List<SqlDb> напрямую, подумайте о наследовании от List<SqlDb>, а не ICollection<SqlDb>.

3 голосов
/ 01 марта 2012

У меня вопрос "зачем вообще наследовать от ICollection, когда вам нужно самим добавлять такие методы, как" Добавить "," Содержит "и т. Д.

ICollection<T> - это интерфейс - он просто указывает элементы, которые вы должны реализовать. Если вы хотите получить от чего-то, что уже имеет реализацию, посмотрите на Collection<T>. Вы бы внедрили интерфейс самостоятельно, если бы хотели создать собственную структуру данных сбора со своими собственными особыми характеристиками - я сомневаюсь, что вы хотите это сделать.

Если честно, непонятно, зачем вам вообще нужен собственный класс - почему бы просто не использовать List<SqlDb> в клиентском коде напрямую?

2 голосов
/ 01 марта 2012

Причиной наследования от ICollection <> является создание собственного настраиваемого типа коллекции. Затем, где бы метод ни имел входную переменную ICollection <>, поскольку вы унаследовали от ICollection <>, ваш новый пользовательский тип коллекции может быть передан.

В вашем случае вы могли бы просто использовать List <>, пока не обнаружите необходимость в создании пользовательской коллекции.

2 голосов
/ 01 марта 2012

Интерфейсы - это только скелеты.Они не содержат никакой логики, они содержат только сигнатуры всех методов, свойств и т. Д.

Интерфейсы

1 голос
/ 01 марта 2012

Ответ на вопрос «зачем вообще наследовать от ICollection, когда вам нужно добавить такие методы, как« Добавить »»:

вам не нужно наследовать ICollection, если вам не нужно / не нужно иметь Add/ Далее и т. Д.

...