Абстрактные и запечатанные классы и члены классов (Руководство по программированию на C#)Abstract and Sealed Classes and Class Members (C# Programming Guide)

Ключевое слово abstract позволяет создавать классы и члены классов, которые являются неполными и должны быть реализованы в производном классе.The abstract keyword enables you to create classes and class members that are incomplete and must be implemented in a derived class.

Ключевое слово sealed позволяет предотвратить наследование класса или определенных членов класса, помеченных ранее как virtual.The sealed keyword enables you to prevent the inheritance of a class or certain class members that were previously marked virtual.

Абстрактные классы и члены классовAbstract Classes and Class Members

Классы могут быть объявлены абстрактными путем помещения ключевого слова abstract перед определением класса.Classes can be declared as abstract by putting the keyword abstract before the class definition. Пример:For example:

public abstract class A
{
    // Class members here.
}

Создавать экземпляры абстрактного класса нельзя.An abstract class cannot be instantiated. Назначение абстрактного класса заключается в предоставлении общего определения для базового класса, которое могут совместно использовать несколько производных классов.The purpose of an abstract class is to provide a common definition of a base class that multiple derived classes can share. Например, в библиотеке классов может быть определен абстрактный класс, используемый в качестве параметра для многих из ее функций, поэтому программисты, использующие эту библиотеку, должны задать свою реализацию этого класса, создав производный класс.For example, a class library may define an abstract class that is used as a parameter to many of its functions, and require programmers using that library to provide their own implementation of the class by creating a derived class.

Абстрактные классы могут определять абстрактные методы.Abstract classes may also define abstract methods. Для этого перед типом возвращаемого значения метода необходимо поместить ключевое слово abstract.This is accomplished by adding the keyword abstract before the return type of the method. Пример:For example:

public abstract class A
{
    public abstract void DoWork(int i);
}

Абстрактные методы не имеют реализации, поэтому определение такого метода заканчивается точкой с запятой вместо обычного блока метода.Abstract methods have no implementation, so the method definition is followed by a semicolon instead of a normal method block. Классы, производные от абстрактного класса, должны реализовывать все абстрактные методы.Derived classes of the abstract class must implement all abstract methods. Если абстрактный класс наследует виртуальный метод из базового класса, абстрактный класс может переопределить виртуальный метод с помощью абстрактного метода.When an abstract class inherits a virtual method from a base class, the abstract class can override the virtual method with an abstract method. Пример:For example:

// compile with: -target:library
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

Если метод virtual объявляется как abstract, он все равно считается виртуальным по отношению к любому классу, наследующему от абстрактного класса.If a virtual method is declared abstract, it is still virtual to any class inheriting from the abstract class. Класс, наследующий абстрактный метод, не может получать доступ к исходной реализации метода (так, в предыдущем примере DoWork для класса F не может вызывать DoWork для класса D). Таким образом, абстрактный класс может принудительно задавать необходимость предоставлять новые реализации виртуальных методов в производных классах.A class inheriting an abstract method cannot access the original implementation of the method—in the previous example, DoWork on class F cannot call DoWork on class D. In this way, an abstract class can force derived classes to provide new method implementations for virtual methods.

Запечатанные классы и члены классовSealed Classes and Class Members

Классы могут быть объявлены как запечатанные путем помещения ключевого слова sealed перед определением класса.Classes can be declared as sealed by putting the keyword sealed before the class definition. Пример:For example:

public sealed class D
{
    // Class members here.
}

Запечатанный класс не может использоваться в качестве базового класса.A sealed class cannot be used as a base class. Поэтому он также не может быть абстрактным классом.For this reason, it cannot also be an abstract class. Запечатанные классы предотвращают наследование.Sealed classes prevent derivation. Поскольку их нельзя использовать в качестве базовых классов, определенная оптимизация во время выполнения позволяет несколько ускорить вызов членов запечатанных классов.Because they can never be used as a base class, some run-time optimizations can make calling sealed class members slightly faster.

Метод, индексатор, свойство или событие для производного класса, переопределяющего виртуальный член базового класса, может объявлять этот член как запечатанный.A method, indexer, property, or event, on a derived class that is overriding a virtual member of the base class can declare that member as sealed. Это делает бесполезным виртуальный аспект члена для каждого последующего производного класса.This negates the virtual aspect of the member for any further derived class. Для этого в объявлении члена класса необходимо перед ключевым словом override поместить ключевое слово sealed.This is accomplished by putting the sealed keyword before the override keyword in the class member declaration. Пример:For example:

public class D : C
{
    public sealed override void DoWork() { }
}

См. такжеSee also