Абстрактные классы в C#

Абстрактные классы отличаются от обычных тем, что в них присутствуют нереализованные члены (методы, свойства или события). Абстрактные классы помечаются модификатором 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:

Дизасемблированный абстрактный метод Print()
Дизасемблированный абстрактный метод Print()
avatar
5000
  Подписаться  
Уведомление о