Инкапсуляция, полиморфизм, наследование
Все языки OOP, включая С++, основаны на трёх основополагающих концепциях, называемых инкапсуляцией, полиморфизмом и наследованием. Рассмотрим эти концепции.
1. Инкапсуляция
Инкапсуляция (encapsulation) — это механизм, который объединяет данные и код, манипулирующий зтими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый «чёрный ящик». Когда коды и данные объединяются таким способом, создаётся объект (object). Другими словами, объект — это то, что поддерживает инкапсуляцию.
Внутри объекта коды и данные могут быть закрытыми (private). Закрытые коды или данные доступны только для других частей этого объекта. Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.
На самом деле объект является переменной определённого пользователем типа. Может показаться странным, что объект, который объединяет коды и данные, можно рассматривать как переменную. Однако применительно к объектно-ориентированному программированию это именно так. Каждый элемент данных такого типа является составной переменной.
2. Полиморфизм
Полиморфизм (polymorphism) (от греческого polymorphos) — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).
В более общем смысле, концепцией полиморфизма является идея «один интерфейс, множество методов». Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает мнижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс. Пример из предыдущего абзаца показывает, как, имея три имени для функции определения абсолютной величины числа вместо одного, обычная задача становится более сложной, чем это действительно необходимо.
Полиморфизм может применяться также и к операторам. Фактически во всех языках программирования ограниченно применяется полиморфизм, например, в арифметических операторах. Так, в Си, символ + используется для складывания целых, длинных целых, символьных переменных и чисел с плавающей точкой. В этом случае компилятор автоматически определяет, какой тип арифметики требуется. В С++ вы можете применить эту концепцию и к другим, заданным вами, типам данных. Такой тип полиморфизма называется перегрузкой операторов (operator overloading).
Ключевым в понимании полиморфизма является то, что он позволяет вам манипулировать объектами различной степени сложности путём создания общего для них стандартного интерфейса для реализации похожих действий.
3. Наследовние
Наследование (inheritance) — это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации. Например, подумайте об описании жилого дома. Дом — это часть общего класса, называемого строением. С другой стороны, строение — это часть более общего класса — конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека. В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным. Наследование играет очень важную роль в OOP.
Русский [ править ]
Приставка: ин-; корень: -капсул-; суффикс: -яциj; окончание: -я [Тихонов, 1996] .
Произношение [ править ]
- МФА: [ ɪnkəpsʊˈlʲat͡sɨɪ̯ə ]
Семантические свойства [ править ]
Значение [ править ]
- прогр. , в объектно-ориентированном программировании сокрытие внутренней структуры данных и реализации методов объекта от остальной программы ◆ Отсутствует пример употребления (см. рекомендации ).
- информ. в сетевых технологиях метод, используемый многоуровневыми протоколами передачи данных, в которых на каждом уровне добавляется заголовок вышележащего протокола ◆ Отсутствует пример употребления (см. рекомендации ).
- мед.процесс отграничения очага воспаления или инородного тела путём образования вокруг него фиброзной оболочки ◆ Отсутствует пример употребления (см. рекомендации ).
Синонимы [ править ]
Русский [ править ]
Глагол, двувидовой (может образовывать формы совершенного и несовершенного вида), переходный, тип спряжения по классификации А. Зализняка — 2a.
Корень: -инкапсул-; интерфикс: -ир-; суффикс: -ова; глагольное окончание: -ть.
Произношение [ править ]
- МФА: [ ɪnkəpsʊˈlʲirəvətʲ ]
Семантические свойства [ править ]
Значение [ править ]
- помещать в оболочку, капсулу ◆ Документы архивного хранения, единичные листы рукописей инкапсулируют — заключают в «капсулы» из прозрачной светостойкой прочной и долговечной плёнки. С. А. Добрусина, Е. С. Чернина, «Научные основы консервации документов», 1993 г. [Google Книги]
- прогр. использовать инкапсуляцию — сокрытие внутренней структуры данных и реализации методов объекта от остальной программы ◆ Мы видим три чётко выделенных уровня, каждый из которых инкапсулирует некоторые аспекты поведения программы и скрывает детали реализации от других уровней. Брюс Е. Крелль, «Pocket PC. Руководство разработчика», 2010 г. [Google Книги]
Синонимы [ править ]
Антонимы [ править ]
Гиперонимы [ править ]
Основные принципы ООП: инкапсуляция в программировании
Основные принципы ООП включают в себя инкапсуляцию. Рассмотрим главные преимущества принципа и пример инкапсуляции данных.
Принцип инкапсуляции является одним из основных принципов объектно-ориентированного программирования и подразумевает скрытие внутренней реализации объекта от внешнего мира. Это означает, что данные и методы, которые оперируют с этими данными, объединяются в единое целое, называемое классом.
Внешний код может взаимодействовать с объектом только через определенные интерфейсы, предоставленные классом, не имея прямого доступа к его внутренним данным.
Преимущества принципа инкапсуляции
Инкапсуляция данных имеет множество практических применений в разработке программного обеспечения. Вот несколько примеров использования инкапсуляции на практике:
- Безопасность данных. Инкапсуляция позволяет защитить данные объекта от некорректного доступа и изменения извне. Класс может предоставлять только определенные методы (геттеры и сеттеры) для доступа к данным, которые проверяют правильность операций и обеспечивают безопасность данных.
- Сокрытие реализации. Когда класс инкапсулирует свою реализацию, то изменения внутри класса не отражаются на внешнем коде. Это позволяет менять реализацию объекта, не нарушая функциональность клиентского кода, что облегчает поддержку и эволюцию программы.
- Упрощение интерфейса. Инкапсуляция позволяет предоставить простой и понятный интерфейс для работы с объектами. Клиентский код взаимодействует только с публичными методами класса, не требуя знания деталей его внутренней реализации.
- Модульность. Инкапсуляция помогает создавать модульные системы, где каждый класс представляет собой отдельный модуль со своими данными и методами. Модули могут взаимодействовать друг с другом через публичные интерфейсы, что способствует повышению читаемости и понимаемости кода.
- Принцип единственной ответственности. Инкапсуляция способствует соблюдению принципа единственной ответственности (Single Responsibility Principle). Класс, инкапсулирующий определенные данные и операции с ними, должен отвечать только за эти данные и их обработку.
- Контроль доступа. Инкапсуляция ООП позволяет устанавливать уровни доступа к данным и методам класса. Таким образом, некоторые данные и функциональность могут быть скрыты от других классов или пакетов, что способствует защите и контролю кода.
Применение процесса инкапсуляции в практике программирования помогает создавать более структурированный, безопасный и расширяемый код. Она способствует лучшему управлению сложностью программы и облегчает сотрудничество между разработчиками при разработке больших проектов.
Пример инкапсуляции в ООП
Рассмотрим инкапсуляцию на простом примере:
public class BankAccount < private String accountNumber; // Закрытое поле для номера счета private double balance; // Закрытое поле для баланса счета // Конструктор класса public BankAccount(String accountNumber, double initialBalance) < this.accountNumber = accountNumber; this.balance = initialBalance; >// Метод для получения номера счета (getter) public String getAccountNumber() < return accountNumber; >// Метод для получения баланса счета (getter) public double getBalance() < return balance; >// Метод для внесения денег на счет public void deposit(double amount) < if (amount >0) < balance += amount; >> // Метод для снятия денег со счета public void withdraw(double amount) < if (amount >0 && amount > >
В приведенном примере класс BankAccount инкапсулирует данные о банковском счете ( accountNumber и balance ) и предоставляет интерфейс для работы с ними. Поля accountNumber и balance объявлены как private , что делает их доступными только внутри класса.
Для доступа к данным счета извне класса используются публичные методы (геттеры и сеттеры). В данном случае, методы getAccountNumber() и getBalance() позволяют получить номер счета и баланс соответственно. А методы deposit() и withdraw() предоставляют возможность внести или снять деньги со счета.
Таким образом, внешний код может использовать объект BankAccount , зная только публичные методы, а не внутренние детали реализации класса. Это позволяет безопасно изменять внутреннюю реализацию класса BankAccount , не затрагивая код, который с ним взаимодействует.
