C++ Интерфейс (Абстрактный класс)

Интерфейс описывает поведение и функциональность класса, не требуя конкретной реализации класса.

Интерфейсы C++ реализуются с помощьюабстрактных классов. Не следует путать абстрактные классы и абстракцию данных; абстракция данных — это концепция, которая отделяет детали реализации от связанных данных.

Если хотя бы одна функция в классе объявлена как чисто виртуальная функция, то класс является абстрактным классом. Чисто виртуальная функция задаётся с помощью "= 0" в её объявлении, как показано ниже:

class Box { public: // Чисто виртуальная функция virtual double getVolume() = 0; private: double length; // Длина double breadth; // Ширина double height; // Height };

ПроектированиеАбстрактный классЦель абстрактного класса (часто называемого ABC) — предоставить подходящий базовый класс, от которого могут наследоваться другие классы. Абстрактные классы нельзя использовать для создания объектов; их можно использовать только какинтерфейсинтерфейсы. Попытка создать экземпляр абстрактного класса приведёт к ошибке компиляции.

Следовательно, если требуется создать экземпляр подкласса ABC, он должен реализовать каждую чисто виртуальную функцию. Это также означает, что C++ поддерживает использование ABC для объявления интерфейсов. Если вы попытаетесь создать экземпляр объекта такого класса, не переопределив чисто виртуальные функции в производном классе, возникнет ошибка компиляции.

Класс, который можно использовать для создания экземпляров объектов, называетсяконкретным классом。

Экземпляр абстрактного класса

См. пример ниже. Базовый класс Shape предоставляет интерфейсgetArea(), реализуемый соответственно в двух производных классах Rectangle и TrianglegetArea():

Пример

#include <iostream> using namespace std; // Базовый класс class Shape { public: // Чисто виртуальные функции, предоставляющие каркас интерфейса virtual int getArea() = 0; void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Производный класс class Rectangle: public Shape { public: int getArea() { return (width * height); } }; class Triangle: public Shape { public: int getArea() { return (width * height)/2; } }; int main(void) { Rectangle Rect; Triangle Tri; Rect.setWidth(5); Rect.setHeight(7); // Вывести площадь объекта cout << "Общая площадь прямоугольника: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // Вывести площадь объекта cout << "Общая площадь треугольника: " << Tri.getArea() << endl; return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

Total Rectangle area: 35
Total Triangle area: 17

Из приведённого выше примера видно, как абстрактный класс определяет интерфейс getArea(), и как два производных класса реализуют эту же функцию с помощью различных алгоритмов вычисления площади.

Стратегия проектирования

Объектно-ориентированная система может использовать абстрактный базовый класс, чтобы предоставить подходящий, общий, стандартизированный интерфейс для всех внешних приложений. Затем, наследуя абстрактный базовый класс, производные классы наследуют все аналогичные операции.

Функции, предоставляемые внешними приложениями (то есть публичные функции), существуют в абстрактном базовом классе как чисто виртуальные функции. Эти чисто виртуальные функции реализуются в соответствующих производных классах.

Такая архитектура также позволяет легко добавлять новые приложения в систему, даже после того, как система уже определена.

Другие расширения