Абстрактный класс в
объектно-ориентированном программировании — базовый класс, который не
предполагает создания экземпляров. Абстрактный класс может содержать (и
не содержать) абстрактные методы и свойства. Абстрактный метод не
реализуется для класса, в котором описан, однако должен быть реализован
для его неабстрактных потомков. Абстрактные классы представляют собой
наиболее общие абстракции, то есть имеющие наибольший объем и наименьшее
содержание.
В одних языках создавать экземпляры абстрактных
классов запрещено, в других это допускается (например, Delphi), но
обращение к абстрактному методу объекта этого класса в процессе
выполнения программы приведёт к ошибке. Во многих языках допустимо
объявить любой класс абстрактным, даже если в нём нет абстрактных
методов (например, Java), именно для запрещения создания экземпляров.
Абстрактный класс можно рассматривать в качестве интерфейса к семейству
классов, порождённому им, но, в отличие от классического интерфейса,
абстрактный класс может иметь определённые методы, а также свойства.
Абстрактные методы часто являются и виртуальными, в связи с чем понятия «абстрактный» и «виртуальный» иногда путают.
В Delphi может быть объявлен абстрактный класс с абстрактными методами:
TAbstractClass = class
procedure NonAbstractProcedure;
procedure AbstractProcedure; abstract;
end;
Для
такого класса может быть создан объект, но обращение к методу
AbstractProcedure этого объекта во время выполнения вызовет ошибку.
В последних версиях Delphi также может быть объявлен абстрактным сам класс:
TAbstractClass = class abstract
procedure SomeProcedure;
end;
Хотя
метод SomeProcedure может быть не абстрактным и реализован в рамках
этого класса, создавать объекты объявленного таким образом класса
недопустимо.
На языке программирования C++ абстрактный класс
объявляется включением хотя бы одной чистой виртуальной функции, типа
virtual _сигнатура_функции_ =0;, которая как и другие может быть
заменена. Пример на языке программирования C++:
#include <iostream.h>
class CA { // Абстрактный класс
public:
CA ( void ) { std::cout << "This object of the class "; }
virtual void Abstr ( void ) = 0; // Чистая (пустая) виртуальная функция.
void fun ( void ) { std::cout << "Реализация не будет наследоваться!"; }
~CA () { std::cout << "." << std::endl; } //Вызывается в обр. порядке конструкторов
};
class CB : public CA {
public:
CB ( void ) { std::cout << "CB;"; }
void Abstr ( void ){ std::cout << " call function cb.Abstr();"; } //Подменяющая функция.
void fun ( void ){ std::cout << " call function cb.fun()"; }
~CB () {} // Неверно для абстр. кл. ~CC(){ ~CA(); }
};
class CC : public CA {
public:
CC ( void ) { std::cout << "CC;"; }
void Abstr ( void ) { std::cout << " call function cc.Abstr();"; } //Подменяющая функция.
void fun ( void ) { std::cout << " call function cc.fun()"; }
~CC () {} // Неверно для абстр. кл. ~CC(){ ~CA(); }
};
int main () {
std::cout << "Program:" << std::endl;
CB cb;
cb.Abstr(); cb.fun(); cb.~CB();
CC cc;
cc.Abstr(); cc.fun(); cc.~CC();
return 0;
}
Результат работы программы:
Program:
This object of the class CB; call function cb.Abstr(); call function cb.fun().
This object of the class CC; call function cc.Abstr(); call function cc.fun().