C++ Интерфейс (Абстрактный класс)
Интерфейс описывает поведение и функциональность класса, не требуя конкретной реализации класса.
Интерфейсы C++ реализуются с помощьюабстрактных классов. Не следует путать абстрактные классы и абстракцию данных; абстракция данных — это концепция, которая отделяет детали реализации от связанных данных.
Если хотя бы одна функция в классе объявлена как чисто виртуальная функция, то класс является абстрактным классом. Чисто виртуальная функция задаётся с помощью "= 0" в её объявлении, как показано ниже:
ПроектированиеАбстрактный классЦель абстрактного класса (часто называемого ABC) — предоставить подходящий базовый класс, от которого могут наследоваться другие классы. Абстрактные классы нельзя использовать для создания объектов; их можно использовать только какинтерфейсинтерфейсы. Попытка создать экземпляр абстрактного класса приведёт к ошибке компиляции.
Следовательно, если требуется создать экземпляр подкласса ABC, он должен реализовать каждую чисто виртуальную функцию. Это также означает, что C++ поддерживает использование ABC для объявления интерфейсов. Если вы попытаетесь создать экземпляр объекта такого класса, не переопределив чисто виртуальные функции в производном классе, возникнет ошибка компиляции.
Класс, который можно использовать для создания экземпляров объектов, называетсяконкретным классом。
Экземпляр абстрактного класса
См. пример ниже. Базовый класс Shape предоставляет интерфейсgetArea(), реализуемый соответственно в двух производных классах Rectangle и TrianglegetArea():
Пример
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
Total Rectangle area: 35 Total Triangle area: 17
Из приведённого выше примера видно, как абстрактный класс определяет интерфейс getArea(), и как два производных класса реализуют эту же функцию с помощью различных алгоритмов вычисления площади.
Стратегия проектирования
Объектно-ориентированная система может использовать абстрактный базовый класс, чтобы предоставить подходящий, общий, стандартизированный интерфейс для всех внешних приложений. Затем, наследуя абстрактный базовый класс, производные классы наследуют все аналогичные операции.
Функции, предоставляемые внешними приложениями (то есть публичные функции), существуют в абстрактном базовом классе как чисто виртуальные функции. Эти чисто виртуальные функции реализуются в соответствующих производных классах.
Такая архитектура также позволяет легко добавлять новые приложения в систему, даже после того, как система уже определена.
Другие расширения