Разница между инкапсуляцией и абстракцией

87

У меня сегодня было интервью. У меня был вопрос от ООП о разнице между инкапсуляцией и абстракцией ?

Я ответил ей, что мне известно, что инкапсуляция в основном предназначена для связывания элементов данных и функций-членов в единый блок, называемый Class . В то время как абстракция в основном скрывает сложность реализации и обеспечивает легкий доступ для пользователей. Я думал, она согласится с моим ответом. Но она поинтересовалась, если цель обоих - скрыть информацию, то в чем на самом деле разница между этими двумя? Я не мог ей ответить.

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

Может ли кто-нибудь обосновать это на простейшем примере?

WpfBee
источник
13
и наконец, вы получили работу? :)
Adrian Księżarczyk 02
1
@WPFbee Жалко!
Аймал Хан
3
Я не знаю, почему люди сравнивают абстракцию и инкапсуляцию. Почему мы не можем принять их как две разные концепции ООП.
Mr ASquare 04
Возможный дубликат разницы между абстракцией и инкапсуляцией?
Сайед Субан
@WpfBee Abstraction не имеет ничего общего с сокрытием, просто ознакомьтесь с моим ответом
S Vinesh

Ответы:

74

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

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

пнкха
источник
7
Отлично. Мне кажется, что ваш ответ просто нацелен на мой вопрос интервьюера. Я пытаюсь повторить ваш ответ на практическом примере. Пожалуйста, дайте мне знать, если это оправдывает ваш ответ. Возьмем, к примеру, телевидение. Инкапсуляция - это внутренние схемы, светодиоды и т. Д., Которые объединяются в телевизор. Абстракция - это кнопки включения-выключения, звука, настройки канала и другие кнопки для управления им.
WpfBee 02
Ребята, абстракция не имеет ничего общего с сокрытием реализации ... абстракция - это метод полиморфного взаимодействия с классом
Mortalus 02
1
@Mortalus - Я не согласен с вашим первым утверждением «абстракция не имеет ничего общего с скрытой реализацией». Я думаю, когда мы начинаем изучать концепцию абстракции, первое, чему нас учат, - это то, что мы скрываем сложность реализации и предоставляем пользователю некоторый интерфейс для ее использования. Потому что пользователя может не интересовать сложность реализации. Вы можете взять практический пример ТВ или переменного тока. Другое дело, что если он не скрывает реализацию, то почему мы предоставляем метод в абстрактном классе, у которого нет тела. Мы явно скрываем реализацию здесь.
WpfBee 02
1
@Mortalus - Кроме того, вы упомянули ссылку на вики. Это первое утверждение: «В информатике абстракция - это процесс, с помощью которого данные и программы определяются с помощью представления, аналогичного по форме их значению (семантике), при этом скрывая детали реализации. Абстракция пытается уменьшить и исключить детали, чтобы программист может сосредоточиться на нескольких концепциях одновременно ". сам по себе предполагает, что абстракция предназначена для сокрытия реализации. Я согласен с вашим вторым утверждением, но не с первым.
WpfBee 02
1
Я думаю, что инкапсуляция - это больше о создании единого модуля, а не о том, скрываете вы это или нет. Если абстракция больше связана с сокрытием вещей, исправьте, если я ошибаюсь.
raj240
22

Это изображение хорошо суммирует разницу между ними:

введите описание изображения здесь

Источник здесь

Хосе Сальгадо
источник
12

Абстракция - это процесс (и результат этого процесса) выявления общих существенных характеристик для набора объектов. Можно сказать, что абстракция - это процесс обобщения: все рассматриваемые объекты включены в надмножество объектов, все из которых обладают заданными свойствами (но отличаются в других отношениях).

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

Это общий ответ, не связанный с конкретным языком программирования (как и был вопрос). Итак, ответ таков: абстракция и инкапсуляция не имеют ничего общего. Но их реализации могут относиться друг к другу (например, в Java: Encapsulation - детали скрыты в классе, Abstraction - детали вообще отсутствуют в классе или интерфейсе).

TT_
источник
11

Инкапсуляция: объединение кода и данных в единый блок. Classявляется примером инкапсуляции, потому что она обертывает метод и свойство.

Абстракция: скрытие внутренних деталей и отображение только функциональности. Абстракция фокусируется на том, что делает объект, а не на том, как он это делает. Он обеспечивает обобщенное представление классов.

int number = 5;
string aStringNumber = number.ToString(); 

Здесь ToString () - это абстракция. И то, как эта numberпеременная механизма преобразовывается в строку и инициализируется в aStringNumberинкапсуляцию.

Давайте возьмем реальный пример калькулятора. Инкапсуляция - это внутренние схемы, батарея и т. Д., Которые вместе составляют калькулятор. Абстракция - это различные кнопки, такие как включение-выключение, очистка и другие кнопки, предназначенные для управления им.

Ариф
источник
7

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

Типичным примером использования абстрактного класса может быть реализация шаблона проектирования метода шаблона, где вводится абстрактная точка внедрения, чтобы конкретный класс мог реализовать ее своим собственным «конкретным» способом.

см .: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

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

см .: http://en.wikipedia.org/wiki/Encapsulation_(object-oriated_programming)

Mortalus
источник
1
абстракция связана с абстрактным классом ??
Вишну Вишванат
@vishnuviswanath, да, мы можем реализовать абстракцию, используя абстрактный класс и интерфейсы.
invzbl3
3

Есть отличная статья, в которой подробно рассматриваются различия между абстракцией, инкапсуляцией и скрытием информации: http://www.tonymarston.co.uk/php-mysql/abstraction.txt

Вот вывод из статьи:

Абстракция, сокрытие информации и инкапсуляция - очень разные, но очень взаимосвязанные концепции. Кто-то может возразить, что абстракция - это метод, который помогает нам определить, какая конкретная информация должна быть видима, а какая - скрыта. Таким образом, инкапсуляция - это метод упаковки информации таким образом, чтобы скрыть то, что нужно скрыть, и сделать видимым то, что должно быть видимым.

Маниш Кумар Шарма
источник
2

разница в обоих случаях заключается в том, что слово «инкапсуляция точки обзора»
используется для сокрытия данных, если наша цель - не допустить, чтобы клиент видел нашу логику изнутри.

Слово абстракции используется для сокрытия данных, если наша цель - показать клиенту внешний вид.

Внешний вид означает, что допустим

BubbleSort(){
//code 
swap(x,y);
}

здесь мы используем swap в пузырьковой сортировке, чтобы просто показать нашему клиенту, какую логику мы применяем, если мы заменим swap (x, y) на весь код здесь, в одном случае он / она не может понять нашу логику

Икбал Хайдер
источник
2

Да, это правда, что абстракция и инкапсуляция предназначены для сокрытия.

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

  • Инкапсуляция - это сокрытие данных на уровне реализации . Например, как на самом деле скрыть данные от прямого / внешнего доступа. Это делается путем привязки данных и методов к одному объекту / блоку для предотвращения внешнего доступа. Таким образом, инкапсуляция также известна как сокрытие данных на уровне реализации.

CodeFu
источник
3
Можете ли вы объяснить, чем этот ответ отличается от 12 других существующих ответов?
Стивен Раух
2

Инкапсуляция:

Что-то скрывает, вроде капсулы с лекарством. Мы не знаем, что находится в капсуле, мы просто ее принимаем. То же, что и в программировании - мы просто скрываем какой-то специальный код метода или свойства, и он дает только вывод, как капсула. Короче говоря, инкапсуляция скрывает данные.

Абстракция:

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

Зишан Хайдер
источник
0

Абстракция

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

Пример. При разработке API миру была раскрыта только абстрактная информация об услуге, а не фактическая реализация. Интерфейс в java может очень хорошо помочь в реализации этой концепции.

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

Инкапсуляция:

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

  1. Если у меня есть индивидуальный пакет, один для вина, а другой для шоколада, и если все классы объявлены в пакете как модификатор доступа по умолчанию, мы обеспечиваем инкапсуляцию на уровне пакета для всех классов.
  2. В пакете, если мы объявляем каждое поле класса (поле-член) как частное и имеем общедоступный метод для доступа к этим полям, таким образом обеспечивая инкапсуляцию уровня класса для этих полей.
Шаан
источник
0

Еще несколько моментов, чтобы прояснить ситуацию,

Нельзя путать абстракцию данных и абстрактный класс. Они разные.

Обычно мы говорим, что абстрактный класс или метод должны что-то скрывать. Но нет .. Это неправильно. Что означает слово «абстрактный»? Поиск Google говорит, что английское слово "абстракция" означает

«Существующий в мысли или как идея, но не имеющий физического или конкретного существования».

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

Итак, когда вы действительно используете абстрактные методы?

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

Итак, об абстрактном классе! - Абстрактный класс не может быть создан только расширенным! Но почему ?

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

Абстрактный класс помогает нам избежать создания его нового экземпляра!

Абстрактный метод в классе заставляет дочерний класс обязательно реализовать эту функцию с предоставленной подписью!

С Винеш
источник
0

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

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

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

Надеюсь, это немного прояснит!

Сурья
источник
0

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

Расика Верагода
источник
0

Вкратце, Abstraction происходит на уровне класса путем сокрытия реализации и реализации интерфейса, позволяющего взаимодействовать с экземпляром класса. Принимая во внимание, Encapsulationчто используется для сокрытия информации; например, сделать переменные-члены закрытыми, чтобы запретить прямой доступ, и предоставить им геттеры и сеттеры для прямого доступа.

Мортеза Банди
источник
0

Да !!!! Если я скажу, что инкапсуляция - это своего рода расширенная абстракция конкретной области ,

Кто из вас прочитал / проголосовал за мой ответ. Давайте разберемся, почему я так говорю.

Прежде чем подавать претензию, мне нужно очистить две вещи.

Один - это скрытие данных, а другой - абстракция.

Скрытие данных

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


Абстракция

Для простоты скрытие внутренних реализаций называется абстракцией. В абстракции мы сосредотачиваемся только на необходимых вещах. По сути, мы говорим о том, «что делать», а не «как делать» в абстракции. Безопасность также может быть достигнута с помощью абстракции, поскольку мы не собираемся акцентировать внимание на том, «как мы реализуем». Ремонтопригодность будет увеличена, поскольку мы можем изменить реализацию, но это не повлияет на нашего конечного пользователя.


Я сказал: «Инкапсуляция - это своего рода расширенная абстракция конкретной области». Почему? потому что мы можем видеть инкапсуляцию как сокрытие данных + абстракцию

инкапсуляция = сокрытие данных + абстракция

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

Вот почему я сказал, что инкапсуляция - это своего рода абстракция.

Так в чем же разница ?

Разница в том, что абстракция является общей, если мы что-то скрываем от пользователя для простоты, удобства обслуживания и безопасности, а также

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

RCvaram
источник
-2

Абстракция: каковы минимальные функции и переменные, которые должны быть доступны вне нашего класса.

Инкапсуляция: как выполнить это требование, то есть как его реализовать.

Надим Алмас Сиддики
источник
Инкапсуляция не является средством достижения абстракции. Это 2 немного разных понятия, но между ними есть тонкая связь.
varsh
Я думаю, что оба понятия не разные, без вас можно добиться инкапсуляции с абстрактным классом.
К Кишор Кумар Редди