Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
Понимание sealed-классов и sealed-методов в C#
Это руководство объясняет, как использовать ключевое слово sealed для ограничения наследования и переопределения методов в C#, с практическими примерами кода.
Sealed-класс
В C# ключевое слово sealed предотвращает наследование класса. Sealed-класс никогда не может иметь производный тип.
Пример:
using System;
namespace SealedClass {
sealed class Animal { }
// Попытка унаследовать sealed-класс вызывает ошибку компиляции
class Dog : Animal { }
class Program {
static void Main(string[] args) {
// создание объекта Dog
Dog d1 = new Dog();
Console.ReadLine();
}
}
}
Компилятор выдает:
error CS0509: 'Dog': cannot derive from sealed type 'Animal'
Sealed-метод
При переопределении виртуального метода можно захотеть запретить дальнейшее переопределение в производных классах. Добавьте sealed перед override для этого.
Пример:
using System;
namespace SealedClass {
class Animal {
public virtual void MakeSound() {
Console.WriteLine("Animal Sound");
}
}
class Dog : Animal {
// Sealed-переопределение
sealed public override void MakeSound() {
Console.WriteLine("Dog Sound");
}
}
class Puppy : Dog {
// Попытка переопределить sealed-метод вызывает ошибку компиляции
public override void MakeSound() {
Console.WriteLine("Puppy Sound");
}
}
class Program {
static void Main(string[] args) {
// создание объекта Puppy
Puppy d1 = new Puppy();
Console.ReadLine();
}
}
}
Результирующая ошибка:
error CS0239: 'Puppy.MakeSound()': cannot override inherited member 'Dog.MakeSound()' because it is sealed
Совет: Запечатывание (sealing) переопределенного метода останавливает дальнейшее переопределение в многоуровневой цепочке наследования.
Зачем использовать sealed-классы?
- Безопасность и целостность — sealed-класс нельзя расширить, поэтому его поведение остается предсказуемым и не может быть изменено подклассами.
- Производительность — среда выполнения может агрессивнее оптимизировать sealed-типы, зная, что подклассов нет.
- Статические утилитарные типы — многие библиотеки предоставляют статические члены через sealed-классы (например,
Pensв System.Drawing).
Например, класс Pens предоставляет предварительно настроенные экземпляры Pen для стандартных цветов:
Pen bluePen = Pens.Blue; // представляет синюю перо
Поскольку Pens запечатан, его статические члены не могут быть переопределены или изменены другими типами.
Язык C
- Классы и объекты в C#: Фундаменты надёжного ООП
- Абстрактные классы и методы в C#: практическое руководство
- Частичные классы и методы в C#: понимание и применение
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Дружественные функции и классы в C++: мастерство контроля доступа
- Java: объекты, классы и основные концепции ООП
- Наследование в C#: базовые и производные классы, интерфейсы
- Полиморфизм в C#: статический и динамический, перегрузка и переопределение
- ASTM A729 Class A: Свойства дважды нормализованной и отпущенной стали
- ASTM A649 Class 2: Спецификации нормализованной и отпущенной конструкционной стали