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
Итоги
Итоги: Помечайте 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 — локальная установка не требуется.
Все уроки этого курса
- virtual/override/sealed и абстрактные классы
- Интерфейсы (введение) и реализация нескольких интерфейсов
- Полиморфизм и динамическая диспетчеризация