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#)
Основные понятия
Руководство по программированию на C#