Вот краткие определения инкапсуляции и абстракции.
Абстракция:
Процесс абстракции в Java используется для того, чтобы скрыть определенные детали и показать только основные особенности объекта. Другими словами, он имеет дело с внешним видом объекта (интерфейса). Единственный хороший пример, который я вижу на разных сайтах, - это интерфейс.
Инкапсуляция:
В основном это скрытие состояния объекта с помощью таких модификаторов, как private, public, protected и т. Д. Мы открываем состояние через общедоступные методы только в случае необходимости.
То, что мы достигаем с помощью таких модификаторов private
, public
также скрывает ненужные детали из внешнего мира, что является не чем иным, как концепцией абстракции.
Итак, из приведенного выше объяснения похоже, что инкапсуляция является частью абстракции или мы можем сказать, что это подмножество абстракции. Но зачем тогда придуман термин инкапсуляции, когда мы можем иметь дело только с абстракцией? Я уверен, что должно быть какое-то существенное различие, которое их отличает, но большая часть материалов в сети говорит о них обоих почти одно и то же.
Хотя этот вопрос уже поднимался на этом форуме и раньше, но я снова задаю его с определенными сомнениями. В некоторых ответах также говорится, что абстракция - это концепция, а инкапсуляция - это реализация. Но я не куплюсь на это - если это правда, то я могу думать, что эти две разные концепции предназначены для того, чтобы нас запутать.
Обновление: - Через 5 лет я придумал свой собственный ответ, суть которого основана на ответах в этом посте и ниже.
An 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
private
public
, поскольку они предоставляют только информацию / скрытие данных, что мы и делаем, потому что это хорошая практика для защиты данных экземпляра.Ответы:
Инкапсуляция - это стратегия, используемая как часть абстракции. Инкапсуляция относится к состоянию объектов - объекты инкапсулируют свое состояние и скрывают его извне; внешние пользователи класса взаимодействуют с ним через его методы, но не могут напрямую получить доступ к состоянию класса. Таким образом, класс абстрагируется от деталей реализации, связанных с его состоянием.
Абстракция - это более общий термин, она также может быть достигнута (среди прочего) путем создания подклассов. Например, интерфейс
List
в стандартной библиотеке представляет собой абстракцию для последовательности элементов, индексированных по их положению, конкретными примерамиList
являются anArrayList
или aLinkedList
. Код, который взаимодействует сList
рефератами, подробно описывает, какой тип списка он использует.Абстракция часто невозможна без сокрытия базового состояния посредством инкапсуляции - если класс раскрывает свое внутреннее состояние, он не может изменить свою внутреннюю работу и, следовательно, не может быть абстрагирован.
источник
Абстракция - это концепция описания чего-либо в более простых терминах, то есть абстрагирование от деталей, чтобы сосредоточиться на том, что важно (это также наблюдается в абстрактном искусстве, например, где художник сосредотачивается на строительных блоках изображений, таких как цвет или формы). Та же идея трансформируется в ООП с помощью иерархии наследования, где более абстрактные концепции находятся наверху, а более конкретные идеи внизу, основанные на их абстракциях. На самом абстрактном уровне нет никаких деталей реализации и, возможно, очень мало общих черт, которые добавляются по мере уменьшения абстракции.
Например, наверху может быть интерфейс с одним методом, затем следующий уровень предоставляет несколько абстрактных классов, которые могут или не могут заполнять некоторые детали о верхнем уровне, но ветвятся, добавляя свои собственные абстрактные методы , то для каждого из этих абстрактных классов есть конкретные классы, обеспечивающие реализации всех остальных методов.
Инкапсуляция - это техника . Это может быть или не быть для помощи в абстракции, но, безусловно, касается сокрытия информации и / или организации. Это требует, чтобы данные и функции были каким-то образом сгруппированы - конечно, хорошая практика ООП требует, чтобы они были сгруппированы по абстракции. Однако есть и другие способы использования, которые просто помогают в ремонтопригодности и т. Д.
источник
Это разные понятия.
Абстракция - это процесс очистки всех ненужных / неважных атрибутов объекта и сохранения только тех характеристик, которые лучше всего подходят для вашей области.
Например, для человека: вы решили оставить имя, фамилию и SSN. Возраст, рост, вес и т. Д. Игнорируются как несущественные.
Абстракция - это то, с чего начинается ваш дизайн.
Т.е. данные и методы связаны вместе.
источник
Инкапсуляция скрывает ненужные данные в капсуле или блоке
Абстракция показывает существенную особенность объекта
Инкапсуляция используется для того, чтобы скрыть его член от внешнего класса и интерфейса. Использование модификаторов доступа, представленных в C #, например, public, private, protected и т. Д., Пример:
Class Learn { private int a; // by making it private we are hiding it from other private void show() //class to access it { console.writeline(a); } }
Здесь у нас есть данные обертывания в единицу или капсулу, то есть класс.
Абстракция используется, чтобы показать пользователю важные и актуальные данные. лучший пример из реальной жизни В мобильном телефоне вы видите различные типы функций, такие как камера, mp3-плеер, функция вызова, функция записи, мультимедиа и т. д. Это абстракция, потому что вы видите только релевантную информацию вместо их внутренней разработки.
abstract class MobilePhone { public void Calling(); //put necessary or essential data public void SendSMS(); //calling n sms are main in mobile } public class BlackBerry : MobilePhone // inherited main feature { public void FMRadio(); //added new public void MP3(); public void Camera(); public void Recording(); }
источник
Абстракция - это очень общий термин, и абстракция в программном обеспечении не ограничивается объектно-ориентированными языками. Словарное определение: «акт рассмотрения чего-либо как общего качества или характеристики, помимо конкретных реалий, конкретных объектов или фактических примеров».
Язык ассемблера можно рассматривать как абстракцию машинного кода - ассемблер выражает основные детали и структуру машинного кода, но освобождает вас от необходимости думать об используемых кодах операций, размещении кода в памяти, выполнении переходов к правильный адрес и т. д.
API вашей операционной системы - это абстракция базовой машины. Ваш компилятор предоставляет уровень абстракции, который ограждает вас от деталей языка ассемблера. Стек TCP / IP, встроенный в вашу операционную систему, абстрагирует детали передачи битов по сети. Если вы дошли до необработанного кремния, то люди, разработавшие ваш ЦП, сделали это, используя принципиальные схемы, написанные в терминах «диодов» и «транзисторов», которые представляют собой абстракции того, как электроны проходят через кристаллы полупроводника.
В программном обеспечении все является абстракцией. Мы создаем программы, которые имитируют или моделируют некоторые аспекты реальности, но по необходимости наши модели всегда абстрагируются от некоторых деталей «реальной вещи». Мы строим слой за слоем абстракций, потому что это единственный способ добиться чего-либо. (Представьте, что вы пытаетесь создать, скажем, решатель судоку, и вам нужно было разработать его, используя только полупроводниковые кристаллы. «Хорошо, мне нужен кусок кремния N-типа ...»)
Для сравнения, «инкапсуляция» - это очень специфический и ограниченный термин. Некоторые другие ответы на этот вопрос уже дали ему хорошие определения.
источник
Отвечая на свой вопрос через 5 лет, так как я чувствую, что все еще нужно больше деталей
Абстракция:
Техническое определение: - Абстракция - это концепция, позволяющая скрыть ненужные детали (сложные или простые) и показать только основные характеристики объекта. Здесь нет реализации, это просто концепция
Что это означает на практике: - Когда я говорю, что моей компании нужен какой-то носитель / устройство, чтобы сотрудники могли подключаться к клиенту. Это чистейшая форма абстракции (например, интерфейс в java), поскольку этим устройством / носителем может быть телефон, интернет, скайп, лично или по электронной почте и т. Д. Я не буду вдаваться в подробности устройства / носителя.
Даже когда я говорю, что моей компании нужен какой-то носитель / устройство, чтобы сотрудники могли подключаться к клиенту через голосовой вызов. Тогда я также говорю абстрактно, но на более низком уровне, поскольку устройство / носитель может быть телефоном, скайпом или чем-то еще и т. Д.
Теперь, когда я говорю, что моей компании нужен телефон, чтобы сотрудники могли общаться с клиентом через голосовой вызов. Тогда я также говорю абстрактно, но на более низком уровне, поскольку телефон может быть любой компании, например iphone, samsung или nokia и т. Д.
Инкапсуляция: - В основном речь идет о сокрытии состояния (информации) объекта с помощью таких модификаторов, как private, public, protected и т. Д. Мы раскрываем состояние через общедоступные методы только в случае необходимости.
Что это означает на практике: - Теперь, когда я говорю, что моей компании нужен iphone, чтобы сотрудники могли подключаться к клиенту через голосовой вызов. Теперь я говорю о каком-то конкретном объекте (например, iphone). Несмотря на то, что я не собираюсь вдаваться в подробности iphone, но iphone имеет некоторую информацию о состоянии / конкретную информацию / реализацию, связанную с ним, где устройство / носитель не имеют. Когда я говорю конкретный объект, на самом деле это означает любой объект, который имеет некоторую (не полную, как абстрактный класс java) реализацию / информацию, связанную с ним.
Таким образом, iphone фактически использовал здесь инкапсуляцию как стратегию, чтобы скрыть свое состояние / информацию и раскрыть только те, которые, по его мнению, должны быть раскрыты. Таким образом, и абстракция, и инкапсуляция скрывают некоторые ненужные детали, но абстракция на уровне концепции и инкапсуляция фактически на уровне реализации.
Это суть, основанная на ответах в этом посте и ниже
источник
Инкапсуляция - процесс сокрытия компонентов класса для предотвращения прямого доступа извне. Это достигается за счет использования модификатора «private» для предотвращения прямого доступа к некоторым членам класса (полю данных или методу) из других классов или объектов, одновременно обеспечивая доступ к этим частным членам через публичные члены (интерфейс). Это делает членов класса защищенными как человеческие органы, скрытые / заключенные под кожей или каким-либо щитом.
Абстракция. При написании программы ООП необходимо соблюдать принцип, гласящий, что «вы должны включать в класс только те компоненты, которые представляют интерес для задачи программы». Например: объект студент имеет много символов как человек: имя, возраст, вес, цвет волос, цвет глаз и т. Д. Но когда вы создаете класс в ООП для работы со студентами, вы должны включать только те символы, которые действительно имеет значение для базы данных студентов: имя, возраст, специальность, уровень, оценки ... и т. д. в C ++ вы можете создать абстрактный класс, используя модификатор virtual с любыми методами класса, что сделает его непригодным для использования напрямую, но вы можете получить от него другие классы и создать реализацию для его членов с добавлением необходимых членов в зависимости от задачи.
источник
Вот как я это понял:
В объектно-ориентированном программировании у нас есть нечто, называемое классами . Для чего они? Они должны хранить некоторое состояние и хранить некоторые методы для изменения этого состояния, то есть они инкапсулируют состояние и его методы.
Он (класс) не заботится о видимости самого себя или своего содержимого. Если мы решим скрыть состояние или некоторые методы, это будет скрытие информации .
Теперь рассмотрим сценарий наследования . У нас есть базовый класс и пара производных (унаследованных) классов. Итак, что здесь делает базовый класс? Он абстрагируется от производных классов.
Все они разные, правда? Но мы смешиваем их, чтобы писать хорошие объектно-ориентированные программы. Надеюсь, это поможет :)
источник
Абстракция определяет контекстно-зависимое упрощенное представление чего-либо; он игнорирует контекстуально нерелевантные детали и включает контекстно-важные детали.
Инкапсуляция ограничивает внешний доступ к частям чего-либо и связывает состояние этого объекта с процедурами, использующими это состояние.
Возьмем, к примеру, людей. В контексте хирургии полезная абстракция игнорирует религиозные убеждения человека и включает тело человека. Кроме того, люди инкапсулируют свои воспоминания с мыслительными процессами, которые используют эти воспоминания. Абстракция не требует инкапсуляции; например, картина человека не скрывает своих частей и не связывает процедуры с его состоянием. И инкапсуляция не обязательно должна иметь ассоциированную абстракцию; например, реальные люди (не абстрактные) инкапсулируют свои органы своим метаболизмом.
источник
НОТА: я делюсь этим. Это не значит, что это плохой ответ, но потому, что я легко понял.
Ответ:
Когда класс концептуализируется, какие свойства мы можем иметь в нем с учетом контекста. Если мы разрабатываем класс Animal в контексте зоопарка, важно, чтобы у нас был атрибут animalType для описания домашних или диких животных. Этот атрибут может не иметь смысла, когда мы проектируем класс в другом контексте.
Точно так же, как мы будем вести себя в классе? Здесь также применяется абстракция. Что здесь необходимо иметь и при какой передозировке? Затем мы отключили часть информации из класса. В этом процессе применяется абстракция.
Когда мы спрашиваем о разнице между инкапсуляцией и абстракцией, я бы сказал, что инкапсуляция использует абстракцию как концепцию. Итак, это только инкапсуляция. Нет, абстракция - это даже концепция, применяемая как часть наследования и полиморфизма.
Перейдите сюда для получения дополнительных сведений по этой теме.
источник
Попробуем понять по-другому.
Что может произойти, если абстракции нет, и что может случиться, если нет инкапсуляции.
Если абстракции нет, можно сказать, что объект используется меньше. Вы не можете идентифицировать объект и не можете получить доступ к его функциям. Возьмем, к примеру, телевизор. Если у вас нет возможности включить, переключить канал, увеличить или уменьшить громкость и т. Д., Тогда в чем польза телевизора и как вы его используете?
Если инкапсуляция отсутствует или не реализована должным образом, вы можете неправильно использовать объект. Там данные / компоненты могут быть использованы не по назначению. Возьмем тот же пример с телевизором. Если для громкости телевизора не выполняется инкапсуляция, то регулятор громкости может использоваться неправильно, заставляя его опускаться ниже или превышать его предел (0-40 / 50).
источник
Инкапсуляция защищает внутреннее поведение объекта / экземпляра от внешнего объекта. Таким образом, необходимо обеспечить контроль, чтобы подтвердить, что предоставляемые данные не нанесут вред внутренней системе экземпляра / объекта, чтобы выжить.
Хороший пример, Divider - это класс, который имеет две переменные экземпляра divisor и divisor, а также метод getDividedValue.
Не могли бы вы подумать, если делитель установлен на 0, внутренняя система / поведение (getDivided) сломается.
Итак, внутреннее поведение объекта можно защитить, выбрасывая исключение через метод.
источник
Я могу сказать простым предложением: сущность абстракции состоит в том, чтобы выделить существенные свойства, опуская несущественные детали. Но почему мы должны опускать несущественные детали? Ключевой мотиватор - предотвращение риска перемен. Вы можете рассматривать абстракцию как инкапсуляцию. Но инкапсуляция означает действие по включению одного или нескольких элементов в контейнер, а не сокрытия деталей. Если вы утверждаете, что «все, что было инкапсулировано, также было скрыто». Это явно не так. Например, даже несмотря на то, что информация может быть инкапсулирована в структуры и массивы записей, эта информация обычно не скрывается (если не скрыта каким-либо другим механизмом).
источник