Абстрактные и запечатанные классы и члены классов (руководство по программированию в C#)

Обновлен: Ноябрь 2007

Ключевое слово abstract позволяет создавать классы и члены классов, которые являются неполными и должны быть реализованы в производном классе.

Ключевое слово sealed позволяет предотвратить наследование класса или определенных членов класса, помеченных ранее как virtual.

Абстрактные классы и члены классов

Классы могут быть объявлены абстрактными путем помещения ключевого слова abstract перед определением класса. Пример.

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

Создавать экземпляры абстрактного класса нельзя. Назначение абстрактного класса заключается в предоставлении общего определения для базового класса, которое могут совместно использовать несколько производных классов. Например, в библиотеке классов может быть определен абстрактный класс, используемый в качестве параметра для многих из ее функций, поэтому программисты, использующие эту библиотеку, должны задать свою реализацию этого класса, создав производный класс.

Абстрактные классы могут определять абстрактные методы. Для этого перед типом возвращаемого значения метода необходимо поместить ключевое слово abstract. Пример.

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

Абстрактные методы не имеют реализации, поэтому определение такого метода заканчивается точкой с запятой вместо обычного блока метода. Классы, производные от абстрактного класса, должны реализовывать все абстрактные методы. Если абстрактный класс наследует виртуальный метод из базового класса, абстрактный класс может переопределить виртуальный метод с помощью абстрактного метода. Пример.

// 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, он все равно считается виртуальным по отношению к любому классу, наследующему от абстрактного класса. Класс, наследующий от абстрактного метода, не может получить доступ к исходной реализации метода — см. предыдущий пример, DoWork в классе F не может вызывать DoWork в классе D. Таким образом абстрактный класс может принуждать производные классы предоставлять новые реализации метода для виртуальных методов.

Запечатанные классы и члены классов

Классы могут быть объявлены sealed путем помещения ключевого слова sealed перед определением класса. Пример.

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

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

Член класса, метод, поле, свойство или событие для производного класса, переопределяющего виртуальный член базового класса, может объявлять этот член как запечатанный. Это делает бесполезным виртуальный аспект члена для каждого последующего производного класса. Для этого в объявлении члена класса необходимо перед ключевым словом override поместить ключевое слово sealed. Пример.

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

См. также

Задачи

Практическое руководство. Определение абстрактных свойств (Руководство по программированию в C#)

Основные понятия

Руководство по программированию в C#

Ссылки

Классы и структуры (Руководство по программированию в C#)

Наследование (Руководство по программированию в C#)

Методы (Руководство по программированию на C#)

Поля (Руководство по программированию в C#)