Странно, но корректно
Один из коллег недавно задал мне вопрос: «Может ли к свойству или методу применяться оба ключевых слова abstract и override ?» . Я мгновенно ответил ему: «конечно, нет!», однако, как выяснилось, в коде проекта Roslyn есть свойства, с обоими ключевыми словами abstract и override. (Именно из-за этого и был задан этот вопрос.)
Я подумал над этим вопросом еще и пересмотрел свою точку зрения. Этот шаблон довольно редкий, но он совершенно корректный и даже разумный. У нас этот случай появился в коде огромной и очень сложной иерархии типов, используемой для представления множества различных концепций в компиляторе. Предположим, базовый класс называется “Thingy”:
abstract class Thingy
{
public virtual string Name { get { return ""; } }
}
У этого класса будет множество наследников, большинство из которых в качестве имени будут возвращать пустую строку, null или что-то еще. Важно не то, что они будут возвращать, а то, что у нас есть разумное имя по умолчанию, которое подходит большинству типов в нашей громадной иерархии.
Однако у нас есть другой абстрактный класс, наследник класса Thingy, скажем FrobThingy, который всегда должен возвращать не пустую строку в свойстве Name. Для предотвращения наследниками класса FrobThingy случайного использования реализации по умолчанию, доступной в базовом классе, мы объявляем следующее:
abstract class FrobThingy : Thingy
{
public abstract override string Name { get; }
}
Теперь, при создании наследника BigFrobThingy, вы знаете, что для компиляции вашего класса вам необходимо предоставить реализацию свойства Name.
Comments
Anonymous
February 09, 2011
Вот, действительно, полезная заметка в отличии от обычного словесного поноса ЭрикаAnonymous
June 01, 2012
> Я мгновенно ответил ему... Странно, что такой "профи" отвечает не думая, будто бы его спросили откровенную несуразицу. Абстрактность не соотносится с виртуальностью, поэтому ничего "странного" тут нет. Скорее, наоборот - разрабы C# думали настолько узколобо, что нагородили кучу непонятных ограничений, которые сами же потом обходят костылями, реализуя "новые фичи" (которые, по идее, уже давно должны были быть в компилере).Anonymous
August 22, 2012
Ну да а ты один из идеальных людей которые сразу видят все подводные камни и проблемы в процессе разработки. Легко критиковать, трудно создавать что-то правильное и сразу.