Новые расширения в .Net 3.5 позволяют отделить функциональность от интерфейсов.
Например, в .Net 2.0
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
List<IChild> GetChildren()
}
Может (в 3.5) стать:
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
}
public static class HaveChildrenExtension {
public static List<IChild> GetChildren( this IHaveChildren ) {
//logic to get children by parent type and id
//shared for all classes implementing IHaveChildren
}
}
Мне кажется, это лучший механизм для многих интерфейсов. Им больше не нужна абстрактная база для совместного использования этого кода, и функционально код работает так же. Это может сделать код более понятным и простым в тестировании.
Единственный недостаток заключается в том, что реализация абстрактных основ может быть виртуальной, но можно ли обойти эту проблему (будет ли метод экземпляра скрывать метод расширения с тем же именем? Не будет ли такой код вводить в заблуждение?)
Есть ли другие причины не использовать этот шаблон регулярно?
Разъяснение:
Да, я вижу тенденцию к методам расширения - заканчивать с ними повсюду. Я был бы особенно осторожен с любыми типами значений .Net без большого количества экспертных .SplitToDictionary()
я думаю, что у нас есть только строка .SplitToDictionary()
- аналогично .Split()
но с ключом разделитель тоже)
Я думаю, что там есть целая дискуссия о лучшей практике ;-)
(Между прочим: DannySmurf, ваш премьер-министр звучит страшно.)
Я специально спрашиваю здесь об использовании методов расширения, где раньше у нас были методы интерфейса.
Я стараюсь избегать множества уровней абстрактных базовых классов - классы, реализующие эти модели, в основном уже имеют базовые классы. Я думаю, что эта модель может быть более удобной в обслуживании и менее перегруженной, чем добавление дополнительных иерархий объектов.
Это то, что MS сделал с IEnumerable и IQueryable для Linq?