У меня сегодня было интервью. У меня был вопрос от ООП о разнице между инкапсуляцией и абстракцией ?
Я ответил ей, что мне известно, что инкапсуляция в основном предназначена для связывания элементов данных и функций-членов в единый блок, называемый Class . В то время как абстракция в основном скрывает сложность реализации и обеспечивает легкий доступ для пользователей. Я думал, она согласится с моим ответом. Но она поинтересовалась, если цель обоих - скрыть информацию, то в чем на самом деле разница между этими двумя? Я не мог ей ответить.
Прежде чем задать этот вопрос, я прочитал другие темы на StackOverFlow о разнице между этими двумя концепциями ООП . Но я не могу убедить интервьюера.
Может ли кто-нибудь обосновать это на простейшем примере?
источник
Ответы:
Инкапсуляция скрывает переменные или некоторые реализации, которые могут так часто изменяться в классе, чтобы предотвратить прямой доступ к нему посторонних. Они должны получить к нему доступ через методы получения и установки.
Абстракция тоже используется, чтобы что-то скрыть, но в большей степени (класс, интерфейс) . Клиенты, использующие абстрактный класс (или интерфейс), не заботятся о том, кто это был, им просто нужно знать, что он может делать.
источник
Это изображение хорошо суммирует разницу между ними:
Источник здесь
источник
Абстракция - это процесс (и результат этого процесса) выявления общих существенных характеристик для набора объектов. Можно сказать, что абстракция - это процесс обобщения: все рассматриваемые объекты включены в надмножество объектов, все из которых обладают заданными свойствами (но отличаются в других отношениях).
Инкапсуляция - это процесс объединения данных и функций, управляющих этими данными, в единое целое, чтобы скрыть внутреннюю реализацию от внешнего мира.
Это общий ответ, не связанный с конкретным языком программирования (как и был вопрос). Итак, ответ таков: абстракция и инкапсуляция не имеют ничего общего. Но их реализации могут относиться друг к другу (например, в Java: Encapsulation - детали скрыты в классе, Abstraction - детали вообще отсутствуют в классе или интерфейсе).
источник
Инкапсуляция: объединение кода и данных в единый блок.
Class
является примером инкапсуляции, потому что она обертывает метод и свойство.Абстракция: скрытие внутренних деталей и отображение только функциональности. Абстракция фокусируется на том, что делает объект, а не на том, как он это делает. Он обеспечивает обобщенное представление классов.
Здесь ToString () - это абстракция. И то, как эта
number
переменная механизма преобразовывается в строку и инициализируется вaStringNumber
инкапсуляцию.Давайте возьмем реальный пример калькулятора. Инкапсуляция - это внутренние схемы, батарея и т. Д., Которые вместе составляют калькулятор. Абстракция - это различные кнопки, такие как включение-выключение, очистка и другие кнопки, предназначенные для управления им.
источник
Абстракция: обычно делается для обеспечения полиморфного доступа к набору классов. Абстрактный класс не может быть создан, поэтому другой класс должен быть производным от него, чтобы создать более конкретное представление.
Типичным примером использования абстрактного класса может быть реализация шаблона проектирования метода шаблона, где вводится абстрактная точка внедрения, чтобы конкретный класс мог реализовать ее своим собственным «конкретным» способом.
см .: http://en.wikipedia.org/wiki/Abstraction_(computer_science)
Инкапсуляция: это процесс сокрытия сложности реализации определенного класса от клиента, который собирается его использовать. Имейте в виду, что «клиент» может быть программой или событием, написавшим класс.
см .: http://en.wikipedia.org/wiki/Encapsulation_(object-oriated_programming)
источник
Есть отличная статья, в которой подробно рассматриваются различия между абстракцией, инкапсуляцией и скрытием информации: http://www.tonymarston.co.uk/php-mysql/abstraction.txt
Вот вывод из статьи:
источник
разница в обоих случаях заключается в том, что слово «инкапсуляция точки обзора»
используется для сокрытия данных, если наша цель - не допустить, чтобы клиент видел нашу логику изнутри.
Слово абстракции используется для сокрытия данных, если наша цель - показать клиенту внешний вид.
Внешний вид означает, что допустим
здесь мы используем swap в пузырьковой сортировке, чтобы просто показать нашему клиенту, какую логику мы применяем, если мы заменим swap (x, y) на весь код здесь, в одном случае он / она не может понять нашу логику
источник
Да, это правда, что абстракция и инкапсуляция предназначены для сокрытия.
Использование только важных деталей и скрытие ненужных данных на уровне проектирования называется абстракцией . (Подобно выбору только соответствующих свойств для класса «Автомобиль», чтобы сделать его более абстрактным или общим.)
Инкапсуляция - это сокрытие данных на уровне реализации . Например, как на самом деле скрыть данные от прямого / внешнего доступа. Это делается путем привязки данных и методов к одному объекту / блоку для предотвращения внешнего доступа. Таким образом, инкапсуляция также известна как сокрытие данных на уровне реализации.
источник
Инкапсуляция:
Что-то скрывает, вроде капсулы с лекарством. Мы не знаем, что находится в капсуле, мы просто ее принимаем. То же, что и в программировании - мы просто скрываем какой-то специальный код метода или свойства, и он дает только вывод, как капсула. Короче говоря, инкапсуляция скрывает данные.
Абстракция:
Абстракция означает скрытие логики или реализации. Например, мы берем таблетки и видим их цвет, но не знаем, для чего это нужно и как это действует на организм.
источник
Абстракция
В Java абстракция означает сокрытие информации от реального мира. Он устанавливает договор между сторонами о том, «что мы должны делать, чтобы воспользоваться услугой».
Пример. При разработке API миру была раскрыта только абстрактная информация об услуге, а не фактическая реализация. Интерфейс в java может очень хорошо помочь в реализации этой концепции.
Интерфейс обеспечивает договор между сторонами, например, производителем и потребителем. Производитель производит товар, не сообщая потребителю, как производится товар. Но через интерфейс производитель сообщает всем потребителям, какой продукт можно купить. С помощью абстракции производитель может продавать продукт своим потребителям.
Инкапсуляция:
Инкапсуляция - это один уровень абстракции. Одна и та же производственная компания пытается скрыть информацию друг от друга по производственной группе. Например, если компания производит вино и шоколад, инкапсуляция помогает скрыть информацию о том, как каждый продукт изготавливается друг из друга.
источник
Еще несколько моментов, чтобы прояснить ситуацию,
Нельзя путать абстракцию данных и абстрактный класс. Они разные.
Обычно мы говорим, что абстрактный класс или метод должны что-то скрывать. Но нет .. Это неправильно. Что означает слово «абстрактный»? Поиск Google говорит, что английское слово "абстракция" означает
«Существующий в мысли или как идея, но не имеющий физического или конкретного существования».
И это верно и в случае абстрактного класса. Он не скрывает содержимое метода, но содержимое метода уже пусто (не имеющее физического или конкретного существования), но оно определяет, каким должен быть метод (существовать в мысли или как идея) или метод должен быть в классе .
Итак, когда вы действительно используете абстрактные методы?
Итак, об абстрактном классе! - Абстрактный класс не может быть создан только расширенным! Но почему ?
Абстрактный класс помогает нам избежать создания его нового экземпляра!
Абстрактный метод в классе заставляет дочерний класс обязательно реализовать эту функцию с предоставленной подписью!
источник
Позвольте мне объяснить это тем же примером, который обсуждался выше. Пожалуйста, рассмотрите тот же телевизор.
Инкапсуляция : настройки, которые мы можем сделать с помощью пульта дистанционного управления, являются хорошим примером - Увеличение / уменьшение громкости, цвет и контраст - Все, что мы можем сделать, это настроить его на минимальное и максимальное значения, предоставленные и не можем делать ничего, кроме того, что предусмотрено на пульте - Представьте себе геттер и сеттер здесь (функция сеттера проверит, допустимо ли предоставленное значение, если да, она обработает операцию, если нет, не позволит нам вносить изменения - например, мы не можем уменьшить громкость выше нуля, даже если мы нажимаем громкость вниз кнопку сто раз).
Абстракция : мы можем взять тот же пример здесь, но с более высокой степенью / контекстом. Кнопка уменьшения громкости уменьшает громкость - и это информация, которую мы предоставляем пользователю, и пользователь не знает ни инфракрасного передатчика внутри пульта дистанционного управления, ни приемника в телевизоре и последующего процесса анализа сигнала и микропроцессора. архитектура внутри телевизора. Проще говоря, это не нужно в контексте - просто предоставьте то, что необходимо. Здесь можно легко связать определение Учебника, то есть, скрыть внутреннюю реализацию и указать только то, что она будет делать, а не то, как она это делает!
Надеюсь, это немного прояснит!
источник
Если бы я был тем, кто участвовал в собеседовании, я бы сказал, что абстракция и инкапсуляция точки зрения конечного пользователя почти одинаковы. Это не что иное, как сокрытие информации. С точки зрения разработчика программного обеспечения, абстракция решает проблемы на уровне дизайна, а инкапсуляция решает проблемы на уровне реализации.
источник
Вкратце,
Abstraction
происходит на уровне класса путем сокрытия реализации и реализации интерфейса, позволяющего взаимодействовать с экземпляром класса. Принимая во внимание,Encapsulation
что используется для сокрытия информации; например, сделать переменные-члены закрытыми, чтобы запретить прямой доступ, и предоставить им геттеры и сеттеры для прямого доступа.источник
Да !!!! Если я скажу, что инкапсуляция - это своего рода расширенная абстракция конкретной области ,
Кто из вас прочитал / проголосовал за мой ответ. Давайте разберемся, почему я так говорю.
Прежде чем подавать претензию, мне нужно очистить две вещи.
Один - это скрытие данных, а другой - абстракция.
Скрытие данных
В большинстве случаев мы не предоставляем прямой доступ к нашим внутренним данным. Наши внутренние данные не должны выходить напрямую, поскольку посторонний человек не может напрямую получить доступ к нашим внутренним данным. Все дело в безопасности, поскольку нам нужно защитить внутренние состояния конкретного объекта.Абстракция
Для простоты скрытие внутренних реализаций называется абстракцией. В абстракции мы сосредотачиваемся только на необходимых вещах. По сути, мы говорим о том, «что делать», а не «как делать» в абстракции. Безопасность также может быть достигнута с помощью абстракции, поскольку мы не собираемся акцентировать внимание на том, «как мы реализуем». Ремонтопригодность будет увеличена, поскольку мы можем изменить реализацию, но это не повлияет на нашего конечного пользователя.Я сказал: «Инкапсуляция - это своего рода расширенная абстракция конкретной области». Почему? потому что мы можем видеть инкапсуляцию как сокрытие данных + абстракцию
При инкапсуляции нам нужно скрыть данные, чтобы посторонний человек не мог их видеть, и нам нужно предоставить методы, которые можно использовать для доступа к данным. Эти методы могут иметь проверки или другие функции внутри этих вещей, также скрытых от постороннего человека. Итак, здесь мы скрываем реализацию методов доступа, и это называется абстракцией.
Вот почему я сказал, что инкапсуляция - это своего рода абстракция.
Так в чем же разница ?
Разница в том, что абстракция является общей, если мы что-то скрываем от пользователя для простоты, удобства обслуживания и безопасности, а также
инкапсуляция - это особый вопрос, связанный с безопасностью внутренних состояний, когда мы скрываем внутреннее состояние (скрытие данных), и мы предоставляем методы для доступа к данным, и реализация этих методов также скрыта от постороннего лица (абстракция).
источник
Абстракция: каковы минимальные функции и переменные, которые должны быть доступны вне нашего класса.
Инкапсуляция: как выполнить это требование, то есть как его реализовать.
источник