[C#] DIP/ISP и коллекции
От: Аноним  
Дата: 22.06.11 09:28
Оценка:
Здравствуйте, уважаемые коллеги!
Делаю рефакторинг нектороых частей проекта в соответствии с DIP (Dependecy-Inversion Principle) и ISP. Вот пример:
    public interface IDataColumnGroup
    {
        /// <summary>
        /// Название группы
        /// </summary>
        string  GroupName                   { get; set; }

        /// <summary>
        /// Возвращает количество колонок в группе
        /// </summary>
        int     Count                       { get; }

        /// <summary>
        /// Getter колонки
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        IDataColumn GetDataColumn(int index);

        /// <summary>
        /// Setter колонки
        /// </summary>
        /// <param name="index"></param>
        /// <param name="dataColumn"></param>
        void SetDataColumn(int index, IDataColumn dataColumn);

        /// <summary>
        /// Вставляет (добавляет) колонку в указанную позицию
        /// </summary>
        /// <param name="index"></param>
        /// <param name="dataColumn"></param>
        void InsertDataColumn(int index, IDataColumn dataColumn);
        
        /// <summary>
        /// Удаляет колонку из указанной позиции
        /// </summary>
        /// <param name="index"></param>
        void RemoveAtDataColumn(int index);
        
        /// <summary>
        /// Очищает список колонок, входящих в данную группу
        /// </summary>
        void ClearGroup();
    }

От этого интерфейса, по идее, должен быть класс DataColumnGroup:
    public class DataColumnGroup : IDataColumnGroup
    {
        #region IDataColumnGroup implementation
        public string       GroupName           { get; set; }
        public int          Count
        {
            get {   return _columns.Count; }
        }
        public IDataColumn GetDataColumn(int idx)
        {
            return (IDataColumn)this[idx];
        }
        public void SetDataColumn(int idx, IDataColumn dataColumn)
        {
            this[idx] = new DataColumn(dataColumn);
        }
        public void InsertDataColumn(int idx, IDataColumn dataColumn)
        {
            _columns.Insert(idx, new DataColumn(dataColumn));
        }
        public void RemoveAtDataColumn(int idx)
        {
            _columns.RemoveAt(idx);
        }
        public void ClearGroup()
        {
            _columns.Clear();
        }
        #endregion IDataColumnGroup implementation


        protected List<DataColumn> _columns = new List<DataColumn>();
        public DataColumn      this[int idx]     
        {
            get
            {
                return _columns[idx];
            }

            set
            {
                _columns[idx] = value;
            }
        }
    }

Выделенное, уж очень смущает. Тем более, что IDataColumn могут реализовывать множество классов, которые никакими родственными отношениями не связаны с DataColumn.
Пока, единственный вариант — это делать что-то похожее на это:
protected List<IDataColumn> _columns = new List<IDataColumn>();

и, соответственно, где нужно прописывать
(DataColumn)value

Кто с этим сталкивался? как лучше вы решаете данную задачу?
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.