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

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

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

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

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

Ответ 1

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

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

Ответ 2

Абстракция и инкапсуляция - две важные концепции объектно-ориентированного программирования (OOPS). Инкапсуляция и абстракция являются взаимосвязанными терминами.

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

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

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

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

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

  • OOPS использует инкапсуляцию для обеспечения целостности типа (то есть, чтобы убедиться, что данные используются соответствующим образом), не позволяя программистам беспрепятственно обращаться к данным. Благодаря инкапсуляции доступ к данным может получить только определенная группа функций. Коллективный термин для типов данных и операций (методов), связанных с ограничениями доступа (public/private и т.д.), Является классом.

  • Пример инкапсуляции

    Class Encapsulation
    {
       private int marks;
    
       public int Marks 
       {
          get { return marks; }
          set { marks = value;}
       }
    }
    
  • Пример абстракции

    abstract class Abstraction
    {
        public abstract void doAbstraction();
    }
    
    public class AbstractionImpl: Abstraction
    {
        public void doAbstraction()
        {
           //Implement it
        }
    }
    

Ответ 3

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

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

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

Ответ 4

Это изображение довольно хорошо подводит итог разницы между ними:

enter image description here

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

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

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

Ответ 10

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

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

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

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

  2. OOPS использует инкапсуляцию для обеспечения целостности типа (т.е. Чтобы убедиться, что данные используются соответствующим образом), не позволяя программистам беспрепятственно обращаться к данным. Благодаря инкапсуляции доступ к данным может получить только определенная группа функций. Коллективный термин для типов данных и операций (методов), объединенных вместе с ограничениями доступа (public/private и т.д.), Является классом.

enter image description here

Ответ 11

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

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

Абстракция:

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

Ответ 12

Абстракция скрывает сложность, предоставляя вам более абстрактную картину, вид 10 000 футов, в то время как Encapsulation скрывает внутреннюю работу, так что вы можете ее изменить позже. Другими словами, абстракция скрывает детали на уровне проектирования, а Encapsulation скрывает детали на уровне реализации.

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

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

Например, у нас есть HashMap, который позволяет вам хранить объект с помощью метода put() и извлекать объект с помощью метода get(). Как HashMap реализует этот метод (см. Здесь), является внутренней деталью HashMap, клиент только заботится о том, чтобы положить объект и вернуть его обратно, им не важно, использует ли HashMap массив, как он разрешает конфликт, независимо от того, он использует связанный список или двоичное дерево для хранения объекта, приземляющегося на том же ковше и т.д.

Ответ 13

абстракция

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

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

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

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

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

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

Ответ 14

Да, это правда, что Abstraction и Encapsulation скрываются.

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

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

Ответ 15

Для меня инкапсуляция - это процесс разбивки сложных/сложных процессов на более мелкие и более организованные подпрограммы.

function DoEverything() {
   // do everything
}
function Encapsulation() {
    GetTheLegos(); 
    BuildTheLegoShip();
    PretendYouAreAPirate();
}

Абстракция - это процесс нахождения сходства группы процессов и объединения этих сходств в один процесс.

private void ProcessOne() {
    try {
        // code
    }catch(exception ex) {
        Utilities.log(ex);
        Error.Text = "Error!";
    }
}
private void ProcessTwo() {
    try {
        // different code
    }catch(exception ex) {
        Utilities.log(ex);
        Error.Text = "Error!";
    }
}

И затем преобразуем это во что-то вроде следующего.

private void HandleException(exception ex) {
    Utilities.log(ex);
    Error.Text = "Error!";
}
private void ProcessOne() {
    try {
        // code
    }catch(exception ex) {
        HandleException(ex);
    }
}
private void ProcessTwo() {
    try {
        // code
    }catch(exception ex) {
        HandleException(ex);
    }
}

Ответ 16

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

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

Ответ 17

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

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

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

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

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

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

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

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

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

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

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