Абстрактные классы отличаются от обычных тем, что в них присутствуют нереализованные члены (методы, свойства или события). Абстрактные классы помечаются модификатором abstract
.
Нереализованные методы (свойства, события) называются абстрактными методами (свойствами или событиями) и должны помечаться ключевым словом abstract
. Абстрактные члены должны быть реализованы в наследниках класса. Члены класса с модификатором abstract
переопределяются в производных классах при помощи модификатора override
.
Абстрактные члены класса могут быть только публичными, т.е. помечаться модификатором доступа public
.
Экземпляры абстрактного класса создавать нельзя. Т.е. нельзя вызвать контруктор абстрактного класса, только при помощи ключевого слова base
в наследнике. Абстрактные классы служат только заготовкой, описывающей функционал общий для других классов.
Пример определения абстрактного класса:
// Абстрактный класс Point, реализующий общий функционал // для двухмерных и трехмерных точек abstract class Point { public int X { get; set; } public int Y { get; set; } public abstract void Print(); } class Point2D : Point { // реализация абстрактного метода Print() public override void Print() { Console.WriteLine(string.Format("X={0} : Y={1}", X, Y)); } } class Point3D : Point { public int Z { get; set; } // реализация абстрактного метода Print() public override void Print() { Console.WriteLine(string.Format("X={0} : Y={1} : Z={2}", X, Y, Z)); } }
В этом примере определяется абстрактный класс Point
, служащий заготовкой для двухмерных и трехмерных точек. Этот класс содержит один абстрактный метод – Print()
. Классы Point2D
и Point3D
наследуются от класса Point
и реализуют его абстрактный метод Print()
при помощи ключевого слова override
.
Наследники абстрактного класса обязаны реализовать все его абстрактные члены. Абстрактные члены могут быть не реализованы только в том случае, если класс-наследник сам является абстрактным.
Абстрактные члены класса являются неявно виртуальными, что видно из определения метода, если посмотреть на его дизасемблированный код в ildasm.exe:
