Случай для Базовых классов по Интерфейсам был объяснен хорошо в Подосновных Инструкциях по Кодированию.NET:
Базовые классы по сравнению с Интерфейсами интерфейсный тип является частичным описанием значения, потенциально поддерживаемого многими типами объектов. Используйте базовые классы вместо интерфейсов, когда это возможно. С точки зрения управления версиями классы более гибки, чем интерфейсы. С классом можно поставить Версию 1.0, и затем в Версии 2.0 добавляют новый метод к классу. Пока метод не абстрактен, любые существующие производные классы продолжают функционировать неизменные.
, поскольку интерфейсы не поддерживают наследование реализации, шаблон, который относится к классам, не относится к интерфейсам. Добавление метода к интерфейсу эквивалентно добавлению абстрактного метода для базового класса; любой класс, который реализует интерфейс, повредится, потому что класс не реализует новый метод. Интерфейсы являются соответствующими в следующих ситуациях:
- Несколько несвязанных классов хотят поддерживать протокол.
- Эти классы уже установили базовые классы (например, некоторые - средства управления пользовательским интерфейсом (UI), и некоторые - веб-сервисы XML).
- Агрегирование не является соответствующим или реальным. Во всех других ситуациях наследование классов является лучшей моделью.
Можно также использовать этого.
([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)