Читайте также:
|
|
Абстрактный класс в объектно-ориентированном программировании — базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП - полиморфизм. Абстрактный класс может содержать (и не содержать[1]) абстрактные методы и свойства. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков. Абстрактные классы представляют собой наиболее общие абстракции, то есть имеющие наибольший объем и наименьшее содержание.
В одних языках создавать экземпляры абстрактных классов запрещено, в других это допускается (например, Delphi), но обращение к абстрактному методу объекта этого класса в процессе выполнения программы приведёт к ошибке. Во многих языках допустимо объявить любой класс абстрактным, даже если в нём нет абстрактных методов (например, Java), именно для запрещения создания экземпляров. Абстрактный класс можно рассматривать в качестве интерфейса к семейству классов, порождённому им, но, в отличие от классического интерфейса, абстрактный класс может иметь определённые методы, а также свойства.
Абстрактные методы часто являются и виртуальными, в связи с чем понятия «абстрактный» и «виртуальный» иногда путают.
На языке программирования C++ абстрактный класс объявляется включением хотя бы одной чистой виртуальной функции, типа virtual _сигнатура_функции_ =0;, которая как и другие может быть заменена. Пример на языке программирования C++:
(НАЧАЛО) #include <iostream> 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 () {} // Неверно для абстр. кл. ~CB(){ ~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; } |
Дата добавления: 2015-07-15; просмотров: 305 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Понятие полиморфизма. Использование в языке. | | | Параметризация типов данных в классах и функциях. |