Абстракция данных в C++

Абстракция в C++Абстракция — это метод объектно-ориентированного программирования, с помощью которого мы скрываем детали реализации от пользователя и открываем только тот интерфейс, который требуется.

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

Однако, как конечный пользователь, мы видим только удаленный интерфейс, а не детали реализации всех этих функций.

Абстракция является одним из четырех столпов объектно-ориентированного программирования, и почти все решения ООП основаны на принципах абстракции, т.е. разделении интерфейса и деталей реализации в программе.

Принцип абстракции

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

В ООП эти два слоя (хотя в большинстве случаев это всего лишь один слой) не подвергаются воздействию «внешнего мира». Самый внешний уровень, интерфейс, — это уровень, который предоставляется конечному пользователю для доступа к функциональным возможностям объекта.

В результате любые изменения, внесенные в самые внутренние слои объекта, не очевидны для конечного пользователя, пока интерфейс, с которым работает пользователь, остается прежним.

Реализация абстракции в C++

C++ поддерживает абстракцию. В C++ даже библиотечные функции, которые мы часто используем, можно рассматривать как пример абстракции.

Реализацию абстракции в C++ можно представить следующим образом:

Реализация абстракции в C++

Как показано на схеме выше, мы можем реализовать абстракцию в C++ двумя способами:

Читать также:  Шаблоны в C++ с примерами

1) Использование классов и спецификаторов доступа

Класс, реализованный на C++ со спецификаторами доступа public, private и protected, можно рассматривать как реализацию абстракции.

Как вы уже знаете, использование спецификаторов доступа позволяет нам контролировать доступ, предоставляемый членам класса. Мы можем сделать некоторые члены закрытыми, чтобы они были недоступны вне класса. Мы можем сделать некоторые члены защищенными, чтобы они были доступны только производным классам. Наконец, мы можем сделать некоторые члены общедоступными, чтобы они были доступны за пределами класса.

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

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

Чтобы это лучше понять, давайте рассмотрим следующий пример:

Вывод данных:

Enter num1 : 10
Enter num2 : 20
Sum of the two numbers = 30

В приведенной выше программе у нас есть пример класса, который имеет две целочисленные переменные, num1 и num2. Этот класс также имеет две функции: readNum и displaySum. Элементы данных num1 и num2, а также функция readNum являются частными для класса.

Функция displaySum является общедоступной для класса. В основной функции мы создаем объект образца класса и вызываем displaySum, который считывает два числа, а также печатает их сумму.

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

Читать также:  Алгоритмы в STL

2) Использование реализации заголовочного файла

Обычно мы используем файлы заголовков в программе C++ для импорта и использования предопределенных функций. Для этого мы используем директиву #include для включения заголовочных файлов в программу.

Например, в приведенной выше программе мы использовали функции cin и cout. Что касается этих функций, мы знаем только, как их использовать и какие параметры они принимают.

Мы не знаем, что происходит в фоновом режиме при вызове этих функций или как они реализованы в заголовочном файле iostream. Это еще один способ абстракции, предоставляемый C++.

Кстати, мы не знаем деталей реализации всех функций, которые мы импортируем из заголовочных файлов.

Но вот еще один пример для демонстрации работы абстракции:

Вывод данных:

EmpId = 1 Name = Ved
Employee Salary = 18245.4

В этом примере мы определили сотрудника класса, у которого есть личные данные, такие как empId, имя, сведения о зарплате, такие как базовая и надбавки. Мы также определяем приватную функцию «calculateSalary», которая вычисляет зарплату с использованием базовых выплат и надбавок.

В коде есть конструктор для инициализации всех данных для конкретного объекта сотрудника. Мы также вызываем функцию «calculateSalary» из конструктора для расчета зарплаты текущего сотрудника.

Далее у нас есть функция «display», которая отображает empId, имя и зарплату. В основной функции мы создаем объект класса employee и вызываем функцию отображения.

Вы можете ясно видеть уровень абстракции, который мы предусмотрели в этой программе. Мы скрыли от пользователя все данные о сотрудниках, а также функцию calculateSalary, сделав их приватными.

Читать также:  Виртуальная машина Java

Мы предоставили пользователю только одну функцию отображения, которая предоставляет пользователю всю информацию об объекте сотрудника и в то же время скрывает такие детали, как личные данные и то, как мы рассчитываем зарплату сотрудника.

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

Преимущества абстракции

Ниже перечислены некоторые преимущества абстракции:

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

Итог

Абстракция — одна из самых важных концепций ООП, и она очень хорошо реализована в C++. Используя абстракцию, мы можем держать детали реализации программы в тайне и предоставлять пользователю только те детали, которые нам нужны.

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

В нашей следующей статье мы обсудим с вами инкапсуляцию — еще одну важную особенность ООП в C++.

С Уважением, МониторБанк

Добавить комментарий