2012-03-01 2 views
2

Все, у меня есть приложение, которое необходимо регулярно подключать и удалять несколько баз данных SQL. Я хочу создать класс, который содержит все эти базы данных в виде коллекции, которая может быть переименована. Для этого я унаследовав от ICollection, но есть некоторые thinkg я не понимая:Основы класса .NET 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# в двух словах », и этот вопрос является тем, что выделяется без внимания в этой замечательной книге.

Прошу прощения, Я знаю, что мне что-то не хватает ...

+0

Моя мысль такая же; почему бы вам просто не использовать «Список ' где нужно? Насколько мне известно, у него есть функции, которые вы пытаетесь реализовать. –

+1

@ Killercam, один комментарий ниже предлагает использовать словарь <>.Если вы не захотите «найти» ваше соединение по имени снова и снова, словарь <> будет лучше, потому что вы можете указать такой ключ, как имя базы данных. –

+0

Спасибо за помощь. – MoonKnight

ответ

3

Мой вопрос: «Почему наследовать от ICollection вообще, когда вам нужно добавлять такие методы, как« Добавить »,« Содержит »и т. Д. Самостоятельно?

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

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

+0

Спасибо, Джон, это разобрало мою глупость. И вы правы, мне нужен только «Список » здесь, но я еще не создал свой собственный класс коллекции и не хотел этого делать, но это глупо. Спасибо за ваше время. – MoonKnight

2

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

Interfaces

3

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

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

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

+1

Я бы поместил его в словарь, хотя ... но причины этого еще неизвестны – b0rg

1

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

вам не нужно наследовать ICollection, если вам не нужны/хотят иметь Добавить/Следующий и т. Д.

2

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

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

Смежные вопросы