Как отличается абстракция и инкапсуляция?

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

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

и достигается посредством абстрактных классов.

Некоторые другие говорят

Абстракция означает отображение клиенту только необходимых деталей объект

и

Допустим, у вас есть метод "CalculateSalary" в вашем классе Employee, который принимает EmployeeId как параметр и возвращает зарплату для текущего месяца в качестве целочисленного значения. Теперь, если кто-то хочет использовать этот метод. Ему не нужно заботиться о том, как Employee объект рассчитывает зарплату? Единственное, что ему нужно заботиться, это имя метода, его входные параметры и формат член,

Я googled снова и снова, и ни один из результатов, похоже, не дает мне правильного ответа. Теперь, где инкапсуляция подходит ко всем этим? Я искал и нашел вопрос о переполнении стека. Даже ответы на эти вопросы сбивали с толку Здесь, говорится

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

И здесь другой известный член говорит:

Это разные понятия.

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

Теперь я перепутал всю концепцию. Я знаю об абстрактном классе, наследовании, спецификаторах доступа и всех. Я просто хочу знать , как мне ответить, когда меня спрашивают об абстракции и/или инкапсуляции в интервью.

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

EDIT: мне нужны ответы, немного ориентированные на С#

Ответ 1

Абстракция означает отображение клиенту объекта только необходимых деталей

На самом деле это инкапсуляция. также см. первую часть статьи в Википедии, чтобы не смущать инкапсуляция и скрытие данных. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

Имейте в виду, что, просто скрывая все члены класса 1:1 за свойствами, не является инкапсуляцией вообще. инкапсуляция - это защита инвариантов и скрытие деталей реализации.

вот хорошая статья об этом. http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/ также взгляните на статьи, связанные в этой статье.

классы, свойства и модификаторы доступа - это инструменты для инкапсуляции в С#.

вы делаете инкапсуляцию, чтобы уменьшить сложность.

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

Да, это хорошее определение абстракции.

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

Да, это разные понятия. имейте в виду, что абстракция на самом деле противоположна тому, чтобы сделать объект, подходящий только для ВАШЕГО домена. это для того, чтобы сделать объект подходящим для домена вообще!

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

Хорошими примерами являются классы, предоставляемые инфраструктурой .net, например, список или коллекция. это очень абстрактные классы, которые можно использовать практически везде и во многих доменах. Представьте себе, что если .net только реализовал класс EmployeeList и CompanyList, который мог содержать только список сотрудников и компаний со специфическими свойствами. такие классы были бы бесполезны во многих случаях. и какая боль была бы, если бы вам пришлось повторно реализовать всю функциональность для CarList, например. Таким образом, "Список" ОБРАЩЕН в сторону от сотрудников, компании и автомобиля. Список сам по себе является абстрактным понятием, которое может быть реализовано его собственным классом.

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

вы выполняете абстракцию, чтобы обеспечить повторное использование.

Ответ 2

Инкапсуляция: скрытие данных с помощью геттеров и сеттеров и т.д.

Абстракция: скрытие реализации с использованием абстрактных классов и интерфейсов и т.д.

Ответ 3

Пример абстракции и инкапсуляции Источник изображения

Абстракция: описывается левым и верхним правым изображениями кошки. Хирург и старушка разработали (или визуализировали) животное по-разному. Таким же образом, вы должны поместить различные функции в класс Cat, в зависимости от потребности приложения. У каждого кота есть печень, мочевой пузырь, сердце и легкие, но если вам нужно, чтобы ваша кошка только "мурлыкала", вы отрисуете свою прикладную кошку на дизайн сверху-слева, а не на верхний правый.

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


PS: Перейти здесь по этому же вопросу, чтобы услышать полную историю.

Ответ 4

Я попытаюсь продемонстрировать инкапсуляцию и абстракцию простым способом. Давайте посмотрим..

  • Объединение данных и функций в один блок (называемый класс) известен как инкапсуляция. Инкапсуляция, содержащая и скрывающая информацию об объекте, такую ​​как внутренние структуры данных и код.

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

  • Скрытность сложности,
  • Связывание данных и функций вместе,
  • Выполнение сложного метода Private,
  • Создание переменной экземпляра Private,
  • Скрытие ненужных данных и функций от конечного пользователя.

Инкапсуляция реализует абстракцию.

И абстракция -

  • Показывая, что нужно,
  • Данные должны быть абстрагированы от конечного пользователя,

Давайте посмотрим пример -

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

Customer Screen GUI

Посмотрев на изображение, мы можем сказать, что нам нужен класс клиента.

Шаг - 1: Каков мой клиентский класс?

то есть.

  • 2 переменные для хранения кода клиента и имени клиента.

  • 1 Функция добавления кода клиента и имени клиента в базу данных.

  namespace CustomerContent
    {
       public class Customer
       {
           public string CustomerCode = "";
           public string CustomerName = "";
           public void ADD()
           {
              //my DB code will go here
           }

Теперь только метод ADD не будет работать здесь один.

Шаг -2: Как будет работать валидация, действует функция ADD?

Нам понадобится код подключения к базе данных и код подтверждения (дополнительные методы).

     public bool Validate()
     {
    //Granular Customer Code and Name
    return true;
     }

     public bool CreateDBObject()
     {
    //DB Connection Code
    return true;
     }


class Program
{
   static void main(String[] args)
   {
     CustomerComponent.Customer obj = new CustomerComponent.Customer;

     obj.CustomerCode = "s001";
     obj.CustomerName = "Mac";

     obj.Validate();
     obj.CreateDBObject();

     obj.ADD();
    }
}

Теперь нет необходимости показывать дополнительные методы (Validate(); CreateDBObject() [Сложный и дополнительный метод]) для конечного пользователя. Пользователь должен только видеть и знать о кодах клиента, имени клиента и кнопке ADD который ДОБАВЛЯЕТ запись. Конечный пользователь не заботится о том, КАК он ДОБАВЛЯЕТ данные в базу данных?.

Шаг -3: Частные дополнительные и сложные методы, которые не связаны с взаимодействием конечных пользователей.

Таким образом, делая этот сложный и дополнительный методы приватными, а не публичными (т.е. скрывая эти методы) и удаляя obj.Validate(); obj.CreateDBObject(); из основной программы класса, мы достигаем инкапсуляцию.

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

Итак, теперь полный код выглядит как ниже -

 namespace CustomerContent
 {
     public class Customer
     {
        public string CustomerCode = "";
        public string CustomerName = "";

        public void ADD()
        {
           //my DB code will go here
        }

        private bool Validate()
        {
           //Granular Customer Code and Name
           return true;
        }

        private bool CreateDBObject()
        {
           //DB Connection Code
           return true;
        }


  class Program
  {
     static void main(String[] args)
     {
        CustomerComponent.Customer obj = new CustomerComponent.Customer;

        obj.CustomerCode = "s001";

        obj.CustomerName = "Mac";

        obj.ADD();
   }
}

Сводка:

Шаг -1. Каким должен быть мой класс клиентов? Абстракция.

Шаг -3: шаг -3: приватный дополнительный и сложный метод, который не включает взаимодействие конечных пользователей инкапсуляция.

P.S. - Сложный и быстрый код.

UPDATE: На этой ссылке есть видеоролик для объяснения образца: В чем разница между абстракцией и инкапсуляцией

Ответ 5

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

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

Если "API окон" скрывает детали того, как текст или графика физически отображается в границах окна, это инкапсуляция.

Ответ 6

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

Объектно-ориентированный анализ и проектирование (OOAD) фактически основаны не на двух, а на четырех принципах. Они:

  • Абстракция: означает, что вы включаете только те функции объекта, которые требуются в вашем приложении. Итак, если у каждого банковского счета есть дата открытия, но ваше приложение не должно знать дату открытия счета, вы просто не добавляете поле OpeningDate в свой объектно-ориентированный дизайн (класса BankAccount). Абстракция в OOAD не имеет ничего общего с абстрактными классами в OOP.

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

  • Наследование: - это скорее уловка кодирования, чем реальный принцип. Это избавляет вас от переписывания тех функций, которые вы написали где-то еще. Однако существует мнение, что между новым кодом, который вы пишете, и старым кодом, который вы хотите использовать повторно, должна быть связь. В противном случае никто не запрещает вам писать класс Animal, который наследуется от BankAccount, даже если он абсолютно бессмысленный.

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

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

  • Инкапсуляция: подразумевает объединение связанных функций и предоставление доступа только к нужным. Инкапсуляция - это основа осмысленного проектирования классов в объектно-ориентированном дизайне:

    • объединение связанных данных и методов; и,
    • раскрытие только фрагментов данных и методов, имеющих отношение к работе с внешними объектами.

Другой упрощенный ответ - здесь.


People who argue that "Abstraction of OOAD results in the abstract keyword of OOP"... Well that is incorrect.

Example: When you design a University in an application using object oriented principles, you only design an "abstraction" of the university. Even though there is usually one cash dispensing ATM in almost every university, you may not incorporate that fact if it not needed for your application. And now though you have designed only an abstraction of the university, you are not required to put [TG20] in your class declaration. Your abstract design of university will be a normal class in your application.

Ответ 7

my 2c

целью инкапсуляции является скрыть детали реализации от пользователя вашего класса, например. если вы внутренне сохраните std:: список элементов в своем классе, а затем решите, что std::vector будет более эффективным, вы можете изменить это без заботы пользователя. Тем не менее, как вы взаимодействуете с контейнером stl, благодаря абстракции, как список, так и вектор можно, например, пройти таким же образом, используя аналогичные методы (итераторы).

Ответ 8

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

Ответ 9

Инкапсуляция: скрытие деталей реализации (ПРИМЕЧАНИЕ: методы данных AND/OR), так что только то, что разумно читается/записывается/используется внешними, доступно для них, все остальное прямо "неприкасаемо".

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

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

Ответ 10

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

public class Person
    {
        private int Id { get; set; }
        private string Name { get; set; }
        private string CustomName()
        {
            return "Name:- " + Name + " and Id is:- " + Id;
        }
    }

Когда вы создали класс Person, вы сделали инкапсуляцию, записав свойства и функции вместе (Id, Name, CustomName). Вы выполняете абстракцию, когда вы показываете этот класс клиенту как

Person p = new Person();
p.CustomName();

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

public class Person
        {
            private int Id { get; set; }
            private string Name { get; set; }
            private string LastName {get; set;}
            public string CustomName()
            {
                return "Name:- " + Name + " and Id is:- " + Id + "last name:- " + LastName;
            }
        }

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

Ответ 11

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

Абстракция - это класс для себя.

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

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

Ответ 12

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

Абстракция связана с "почему", я инкапсулирую ее на первое место.

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

Таким образом, я инкапсулировал детали, обобщая (абстрагируя) запрос на проверку.

Я действительно считаю, что абстрагирование и инкапсуляция идут вместе.

Ответ 13

абстракция

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

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

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

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

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

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

Ответ 14

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