abstract override C#

abstract override C#

StepOne

Знаете ли вы, что в C# методы и свойства могут быть помечены одновременно и abstract, и override? Какие могут быть случаи применения такого двойного модификатора? Давайте разберёмся.

Мы знаем, что в C# метод помечается abstract, когда у него отсутствует реализация и её предоставят наследники типа, содержащего наш абстрактный метод. При этом он также станет виртуальным, потому что вызов будет происходить через таблицу виртуальных методов, а реализация помечается override как и любой другой виртуальный метод.

Но что означает совместное использование этих двух ключевых слов? Здесь надо посмотреть немного с другого угла. Допустим у нас есть следующий класс с виртуальным методом:

class Thing
{
  virtual string Name() => "Thing";
}

И мы хотим создать под-иерархию, где будет вообще другая логика формирования имени, но мы не знаем какая именно. При этом нам надо заставить всех членов этой под-иерархии реализовать такую логику. Здесь на помощь и приходит этот странны, но легальный приём:

abstract class SpecialThing
{
  abstract override string Name();
}

Всё! Теперь мы знаем, что все наследники SpecialThing имеют свою особую логику для возврата имени, а каждый наследник этого класса обязан её реализовать, поскольку метод абстрактный.

Также начиная с .NET 5 появился ещё один кейс использования этой фичи. Дело в том, что в эту версию платформы завезли covariant return type. Это то, чего так не хватало в шарпе, но есть Java. Представим что у вас есть некая абстрактная фабрика:

abstract class ThingFactory
{
  abstract Thing Create();
}

И вдруг вам захотелось сделать более конкретную фабрику, но всё ещё абстрактную, так как она должна возвращать абстрактный тип. Благодаря новой возможности платформы можно указать более конкретный тип в сигнатуре, и это будет всё ещё тот же метод:

abstract class SpecialThingFactory
{
  abstract override SpecialThing Create();
}

Такой трюк, кстати, я провернул в своей библиотеке, о которой рассказывал тут.

© Канал StepOne

Report Page