0Pricing
C# Academy · Урок

virtual/override/sealed и абстрактные классы

Изучите виртуальные методы, переопределение, запечатывание переопределений и абстрактные классы; узнайте, как ссылки на базовый тип направляют вызовы к реализациям производных типов.

«virtual/override/sealed и абстрактные классы» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Основы наследования

Цель: Повторно использовать и настраивать поведение с помощью наследования.

  • virtual в базовом классе
  • override в производном классе
  • sealed override, чтобы остановить дальнейшие изменения
  • abstract класс задаёт контракт и общий код

virtual и override

virtual разрешает переопределение. Вызовы через ссылку на базовый класс используют переопределение производного класса (динамическая диспетчеризация).

using System;

// Base method is virtual so derived classes can customize it
public class Shape
{
  public virtual double Area()
  {
    return 0.0; // default
  }
}

public class Rectangle : Shape
{
  public int Width { get; private set; }
  public int Height { get; private set; }

  public Rectangle(int w, int h)
  {
    Width = w; Height = h;
  }

  public override double Area()
  {
    return Width * Height;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Shape s = new Shape();
    Shape r = new Rectangle(3, 4); // base reference
    Console.WriteLine("Shape area = " + s.Area());
    Console.WriteLine("Rectangle area = " + r.Area()); // calls Rectangle.Area()
  }
}

sealed override

Используйте sealed override, чтобы зафиксировать method на определённом уровне иерархии.

using System;

public class BaseLogger
{
  public virtual string Prefix()
  {
    return "[LOG]";
  }
}

public class ConsoleLogger : BaseLogger
{
  public sealed override string Prefix()
  {
    return "[CONSOLE]";
  }
}

// Further derived class cannot override Prefix again:
// public class FancyLogger : ConsoleLogger
// {
//   public override string Prefix() { return "[FANCY]"; } // compile error
// }

public class Program
{
  public static void Main(string[] args)
  {
    ConsoleLogger log = new ConsoleLogger();
    Console.WriteLine(log.Prefix() + " Ready");
  }
}

Абстрактные классы

Абстрактные классы определяют обязательные члены (abstract), а также могут предоставлять общий код.

using System;

// Abstract class: cannot be instantiated; must implement abstract members
public abstract class Animal
{
  public abstract string Speak(); // no body here
  public string Info()
  {
    return "Animal says: " + Speak(); // shared code uses the abstract member
  }
}

public class Dog : Animal
{
  public override string Speak()
  {
    return "Woof";
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    // Animal a = new Animal(); // compile error: abstract
    Animal d = new Dog();
    Console.WriteLine(d.Info()); // calls Dog.Speak()
  }
}

virtual и abstract

Выбирайте:

  • virtual: предоставляет реализацию по умолчанию, которую производные типы могут переопределить.
  • abstract: реализации нет; производные типы обязаны её предоставить.
  • sealed override: запрещает дальнейшие переопределения после фиксации поведения.

Полиморфные вызовы

Полиморфизм: method принимает базовый тип и вызывает переопределённые члены у экземпляров производных типов.

using System;

public class Notifier
{
  public virtual string Channel() { return "Base"; }
}

public class EmailNotifier : Notifier
{
  public override string Channel() { return "Email"; }
}

public class SmsNotifier : Notifier
{
  public override string Channel() { return "SMS"; }
}

public class Program
{
  // Works with any Notifier (polymorphism)
  static void Send(Notifier n, string msg)
  {
    Console.WriteLine("[" + n.Channel() + "] " + msg);
  }

  public static void Main(string[] args)
  {
    Send(new EmailNotifier(), "Hello");
    Send(new SmsNotifier(), "Hi");
  }
}

Правило для virtual, override и sealed

Быстрая проверка: какое утверждение о virtual, override и sealed в C# верно?

Итоги

Итоги: Помечайте methods базового класса как virtual, переопределяйте их в производных типах и используйте sealed override, чтобы зафиксировать поведение. Используйте абстрактные классы, чтобы требовать реализации и одновременно совместно использовать общий код.

Часто задаваемые вопросы

Урок «virtual/override/sealed и абстрактные классы» бесплатный?

Да — полный текст урока «virtual/override/sealed и абстрактные классы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «virtual/override/sealed и абстрактные классы»?

Изучите виртуальные методы, переопределение, запечатывание переопределений и абстрактные классы; узнайте, как ссылки на базовый тип направляют вызовы к реализациям производных типов. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «virtual/override/sealed и абстрактные классы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. virtual/override/sealed и абстрактные классы
  2. Интерфейсы (введение) и реализация нескольких интерфейсов
  3. Полиморфизм и динамическая диспетчеризация
← Назад к C# Academy