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

Модификатор abstract указывает, что изменяемый элемент имеет отсутствующую или неполную реализацию.The abstract modifier indicates that the thing being modified has a missing or incomplete implementation. Модификатор abstract можно использовать с классами, методами, свойствами, индексаторами и событиями.The abstract modifier can be used with classes, methods, properties, indexers, and events. Используйте модификатор abstract в объявлении класса, чтобы указать, что класс предназначен только для использования в качестве базового класса для других классов и не должен быть создан сам по себе.Use the abstract modifier in a class declaration to indicate that a class is intended only to be a base class of other classes, not instantiated on its own. Элементы с пометкой abstract должны быть реализованы не абстрактными классами, производными от абстрактного класса.Members marked as abstract must be implemented by non-abstract classes that derive from the abstract class.

ПримерExample

В этом примере класс Square должен обеспечивать реализацию GetArea, поскольку является производным от класса Shape:In this example, the class Square must provide an implementation of GetArea because it derives from Shape:

abstract class Shape
{
    public abstract int GetArea();
}

class Square : Shape
{
    int side;

    public Square(int n) => side = n;

    // GetArea method is required to avoid a compile-time error.
    public override int GetArea() => side * side;

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

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

}
// Output: Area of the square = 144

Абстрактные классы предоставляют следующие возможности:Abstract classes have the following features:

  • Создавать экземпляры абстрактного класса нельзя.An abstract class cannot be instantiated.

  • Абстрактный класс может содержать абстрактные методы и методы доступа.An abstract class may contain abstract methods and accessors.

  • Изменить абстрактный класс с модификатором sealed нельзя, так как два этих модификатора имеют взаимоисключающие значения.It is not possible to modify an abstract class with the sealed modifier because the two modifiers have opposite meanings. Модификатор sealed запрещает наследование класса, в то время как модификатор abstract указывает, что класс обязан иметь производные классы.The sealed modifier prevents a class from being inherited and the abstract modifier requires a class to be inherited.

  • Неабстрактный класс, производный от абстрактного класса, должен включать фактические реализации всех наследуемых абстрактных методов и методов доступа.A non-abstract class derived from an abstract class must include actual implementations of all inherited abstract methods and accessors.

Модификатор abstract в объявлении метода или свойства позволяет указать, что этот метод или свойство не содержат реализации.Use the abstract modifier in a method or property declaration to indicate that the method or property does not contain implementation.

Абстрактные методы предоставляют следующие возможности:Abstract methods have the following features:

  • Абстрактный метод неявно представляет собой виртуальный метод.An abstract method is implicitly a virtual method.

  • Объявления абстрактных методов допускаются только в абстрактных классах.Abstract method declarations are only permitted in abstract classes.

  • Поскольку объявление абстрактного метода не предоставляет фактической реализации, тело метода отсутствует, а объявление метода заканчивается точкой с запятой, и фигурных скобок ({ }) после подписи нет.Because an abstract method declaration provides no actual implementation, there is no method body; the method declaration simply ends with a semicolon and there are no curly braces ({ }) following the signature. Например:For example:

    public abstract void MyMethod();  
    

    Реализация предоставляется методом override, который является членом неабстрактного класса.The implementation is provided by a method override, which is a member of a non-abstract class.

  • В объявлении абстрактного метода нельзя использовать статические или виртуальные модификаторы.It is an error to use the static or virtual modifiers in an abstract method declaration.

Действие абстрактных свойств аналогично абстрактным методам, за исключением отличий в синтаксисе объявлений и вызовов.Abstract properties behave like abstract methods, except for the differences in declaration and invocation syntax.

  • Использование модификатора abstract в статическом свойстве является недопустимым.It is an error to use the abstract modifier on a static property.

  • Абстрактное наследуемое свойство можно переопределить в производном классе, включив объявление свойства, которое использует модификатор override.An abstract inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

Дополнительные сведения об абстрактных классах см. в разделе Абстрактные и запечатанные классы и члены классов.For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

Абстрактный класс должен предоставлять реализацию для всех членов интерфейса.An abstract class must provide implementation for all interface members.

Абстрактный класс, реализующий интерфейс, может сопоставлять методы интерфейса с абстрактными методами.An abstract class that implements an interface might map the interface methods onto abstract methods. Например:For example:

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

ПримерExample

В следующем примере класс DerivedClass является производным от абстрактного класса BaseClass.In this example, the class DerivedClass is derived from an abstract class BaseClass. Абстрактный класс содержит абстрактный метод, AbstractMethod, и два абстрактных свойства, X и Y.The abstract class contains an abstract method, AbstractMethod, and two abstract properties, X and 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()
    {
        var o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine($"x = {o.X}, y = {o.Y}");
    }
}
// Output: x = 111, y = 161

В предыдущем примере при попытке создать экземпляр абстрактного класса с помощью оператора вида:In the preceding example, if you attempt to instantiate the abstract class by using a statement like this:

BaseClass bc = new BaseClass();   // Error  

Выдается сообщение об ошибке, указывающее, что компилятор не может создать экземпляр абстрактного класса BaseClass.You will get an error saying that the compiler cannot create an instance of the abstract class 'BaseClass'.

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

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also