Это несколько нечеткие понятия, которые не являются уникальными для компьютерных наук и программирования. Я хотел бы высказать некоторые дополнительные мысли, которые могут помочь другим понять эти важные понятия.
Короткий ответ
Инкапсуляция - Скрытие и / или ограничение доступа к определенным частям системы, в то же время открывая необходимые интерфейсы.
Абстракция - Рассмотрение чего-либо с удаленными определенными характеристиками, кроме конкретных реальностей, конкретных объектов или реальных экземпляров, что снижает сложность.
Основное сходство заключается в том, что эти техники направлены на улучшение понимания и полезности.
Основное отличие в том, что абстракция - это средство более простого представления вещей (часто для того, чтобы сделать представление более широко применимым), тогда как инкапсуляция - это метод изменения способа взаимодействия других вещей с что-то.
Длинный ответ
Инкапсуляция
Вот пример инкапсуляции, которая, надеюсь, прояснит ситуацию:
Здесь у нас есть Arduino Uno и Arduino Uno в корпусе. Вложение - отличное представление о том, что такое инкапсуляция.
Инкапсуляция направлена на защиту определенных компонентов от внешних воздействий и знаний, а также на раскрытие компонентов, с которыми должны взаимодействовать другие объекты. В терминах программирования это включает скрытие информации , хотя модификаторы доступа , которые изменяют степень, в которой могут быть определенные переменные и / или свойства читать и писать.
Но помимо этого, инкапсуляция также направлена на то, чтобы обеспечить эти внешние интерфейсы гораздо эффективнее. В нашем примере с Arduino это могут быть красивые кнопки и экран, которые значительно упрощают взаимодействие пользователя с устройством. Они предоставляют пользователю простые способы влиять на поведение устройства и получать полезную информацию о его работе, которая в противном случае была бы намного более сложной.
В программировании это включает в себя группирование различных компонентов в разделяемую конструкцию, такую как function
, class
или object
. Сюда также входит предоставление средств взаимодействия с этими конструкциями, а также методов получения полезной информации о них.
Инкапсуляция помогает программистам многими другими дополнительными способами, не в последнюю очередь это улучшенная поддержка кода и тестируемость.
Абстракция
Хотя многие другие ответы здесь определяли абстракцию как обобщение, я лично считаю, что это определение ошибочно. Я бы сказал, что обобщение на самом деле является специфическим типом абстракции, а не наоборот. Другими словами, все обобщения являются абстракциями, но все абстракции являются , а не обязательно обобщениями.
Вот как мне нравится думать об абстракции:
Вы бы сказали, что на изображении есть дерево? Скорее всего, вы бы. Но действительно ли это 1073 * дерево? Ну конечно нет! Это группа пикселей, которые выглядят как нечто, что мы могли бы назвать деревом. Можно сказать, что это абстракция реального дерева. Обратите внимание, что некоторые визуальные детали дерева опущены. Кроме того, он не растет, не потребляет воду и не производит кислород. Как это могло? это просто набор цветов на экране, представленный байтами в памяти вашего компьютера.
А вот суть абстракции. Это способ упростить вещи, чтобы их было легче понять. Каждая идея, проходящая через вашу голову, является абстракцией реальности. Ваш мысленный образ дерева не более фактического дерева, чем этот JPEG.
В программировании мы могли бы использовать это в своих интересах, создав класс Tree
с методами для симуляции роста, потребления воды и производства кислорода. Наше создание было бы чем-то, что представляет наш опыт реальных деревьев, и включает только те элементы, которые нам действительно нужны для нашей конкретной симуляции. Мы используем абстракцию как способ представления нашего опыта чего-либо с помощью байтов и математики.
Абстрактные классы
Абстракция в программировании также позволяет нам рассмотреть общие черты между несколькими "конкретными" типами объектов (типами, которые фактически существуют) и определить эти общие черты в пределах уникальной сущности. Например, наш класс Tree
может наследоваться от abstract class Plant
, который имеет несколько свойств и методов, применимых ко всем нашим классам, подобным растительным, но удаляет те, которые характерны для каждого типа завод. Это может значительно уменьшить дублирование кода и повысить удобство сопровождения.
Практическое различие abstract class
и простого class
заключается в том, что концептуально не существует "реальных" экземпляров abstract class
. Не имеет смысла создавать объект Plant
, потому что это недостаточно конкретно. Каждый «настоящий» Plant
также является более конкретным типом Plant
.
Кроме того, если мы хотим, чтобы наша программа была более реалистичной, мы могли бы рассмотреть тот факт, что наш класс Tree
может быть слишком абстрактным сам по себе. В действительности каждый Tree
является более конкретным типом Tree
, поэтому мы могли бы создавать классы для таких типов, как Birch
, Maple
и т. Д., Которые наследуются от наших, возможно, теперь abstract
, Tree
класс.
1106 * JVM *
Другим хорошим примером абстракции является Виртуальная машина Java (JVM) , которая предоставляет виртуальный или абстрактный компьютер для запуска кода Java. По сути, он забирает все специфические для платформы компоненты системы и обеспечивает абстрактный интерфейс «компьютера», не касаясь какой-либо конкретной системы.
Разница
Инкапсуляция отличается от абстракции тем, что она не имеет ничего общего с тем, насколько «реальным» или «точным» является нечто. Он не удаляет компоненты чего-либо, чтобы сделать его более простым или более широко применимым. Скорее он может скрыть определенных компонентов для достижения аналогичной цели.