Новые расширения в .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()
- аналогично .Split()
, но с разделителем ключ-значение )
Я думаю, что там есть целая дискуссия о лучших практиках; -)
(Между прочим: DannySmurf, ваш премьер-министр звучит страшно.)
Я специально спрашиваю здесь об использовании методов расширения, где ранее у нас были методы интерфейса.
Я стараюсь избегать множества уровней абстрактных базовых классов - классы, реализующие эти модели, в основном уже имеют базовые классы. Я думаю, что эта модель может быть более удобной в обслуживании и менее перегруженной, чем добавление дополнительных иерархий объектов.
Это то, что MS сделала с IEnumerable и IQueryable для Linq?