abstract (Справочник по C#)

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

Пример

В этом примере класс Square должен предоставить реализацию Area, поскольку он является производным ShapesClass.

abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int side = 0;

    public Square(int n)
    {
        side = n;
    }
    // Area method is required to avoid 
    // a compile-time error. 
    public override int Area()
    {
        return side * side;
    }

    static void Main() 
    {
        Square sq = new Square(12);
        Console.WriteLine("Area of the square = {0}", sq.Area());
    }

    interface I
    {
        void M();
    }
    abstract class C : I
    {
        public abstract void M();
    }

}
// Output: Area of the square = 144

Далее представлены возможности абстрактных классов.

  • Создавать экземпляры абстрактного класса нельзя.

  • Абстрактные классы могут содержать абстрактные методы и методы доступа.

  • Абстрактный класс с модификатором sealed (Справочник по C#) изменить нельзя, поскольку эти два модификатора имеют взаимоисключающие значения. Модификатор sealed запрещает наследовать классу, в то время как модификатор abstract указывает, что класс обязан иметь производные классы.

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

Чтобы указать отсутствие реализации в методе или свойстве, воспользуйтесь модификатором abstract в объявлении метода или свойства.

Далее представлены возможности абстрактных методов.

  • Абстрактный метод является неявным виртуальным методом.

  • Объявления абстрактных методов допускаются только в абстрактных классах.

  • Поскольку объявление абстрактного метода не предоставляет фактической реализации, тело метода отсутствует; объявление метода просто заканчивается двоеточием, а после сигнатуры ставить фигурные скобки ({ }) не нужно. Примеры.

    public abstract void MyMethod();
    

    Реализация предоставляется методом переопределения override (Справочник по C#), который является членом неабстрактного класса.

  • Использование статических или виртуальных модификаторов в объявлении абстрактного метода является недопустимым.

Действие абстрактных свойств аналогично абстрактным методам, за исключением отличий в синтаксисе объявлений и вызовов.

  • Использование модификатора abstract в статическом свойстве является недопустимым.

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

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

Абстрактный класс должен предоставлять реализацию для всех членов интерфейса.

Абстрактный класс, реализующий интерфейс, может отображать методы интерфейса в абстрактных методах. Примеры.

interface I
{
    void M();
}
abstract class C : I
{
    public abstract void M();
}

В этом примере класс DerivedClass является производным от абстрактного класса BaseClass. Абстрактный класс содержит абстрактный метод AbstractMethod и два абстрактных свойства — X и Y.

    abstract class BaseClass   // Abstract class
    {
        protected int _x = 100;
        protected int _y = 150;
        public abstract void AbstractMethod();   // Abstract method 
        public abstract int X    { get; }
        public abstract int Y    { get; }
    }

    class DerivedClass : BaseClass
    {
        public override void AbstractMethod()
        {
            _x++;
            _y++;
        }

        public override int X   // overriding property
        {
            get
            {
                return _x + 10;
            }
        }

        public override int Y   // overriding property
        {
            get
            {
                return _y + 10;
            }
        }

        static void Main()
        {
            DerivedClass o = new DerivedClass();
            o.AbstractMethod();
            Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
        }
    }
    // Output: x = 111, y = 161

В предыдущем примере при попытке создать абстрактный класс с помощью следующего оператора

BaseClass bc = new BaseClass();   // Error

появится сообщение об ошибке, указывающее, что компилятору не удается создать экземпляр абстрактного класса "BaseClass".

Спецификация языка C#

Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Модификаторы (Справочник по C#)

virtual (Справочник по C#)

override (Справочник по C#)

Ключевые слова C#

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

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

Другие ресурсы

Справочник по C#