Может ли метод или свойство быть помеченным как abstract и override одновременно?
Первый ответ: "конечно же нет". Но, оказывается такой вариант возможен.
Рассмотрим такую ситуацию: есть некий класс, который содержит свойство, которое по умолчанию возвращает пустую строку и помеченное как virtual:
abstract class Thingy { public virtual string Name { get { return ""; } } }
Нам необходимо создавать большое количество наследников Thingy, которые будут иметь пустные имена. Но нам также необходимо иметь коллекцию классов с непустыми именами. И мы хотим быть уверенными, что разработчики переопределят этот метод. В таком случае нужно использовать такой код:
abstract class FrobThingy : Thingy { public abstract override string Name { get; } }
Если разработчики не переопределят свойство Name для всех наследников FrobThingy, то компилятор выдаст сообщение об ошибке. Собственно, чего мы и добивались.
http://blogs.msdn.com/b/ericlippert/archive/2011/02/07/strange-but-legal.aspx