Здравствуйте, уважаемые коллеги!
Делаю рефакторинг нектороых частей проекта в соответствии с 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
Кто с этим сталкивался? как лучше вы решаете данную задачу?
Спасибо.