Разница между абстракцией и инкапсуляцией? - PullRequest
319 голосов
/ 13 апреля 2009

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

Ответы [ 39 ]

13 голосов
/ 30 августа 2014

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

Difference between Abstraction and Encapsulation

11 голосов
/ 18 декабря 2009

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

Рассмотрим класс, который отправляет электронное письмо ... он использует абстракцию, чтобы показать себя вам как своего рода мессенджер, так что вы можете вызвать emailSender.send (mail, получатель). Что он на самом деле делает - выбирает POP3 / SMTP, вызывающие серверы, перевод MIME и т. Д., Абстрагируется. Вы видите только своего посыльного мальчика.

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

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

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

Все это делает мир лучшим местом для жизни: D

10 голосов
/ 11 февраля 2011

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

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

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

8 голосов
/ 26 августа 2013

Abstraction и Encapsulation с использованием одного обобщенного примера

-------------------------------------------- -------------------------------------------------- --------------------------------------

Мы все используем калькулятор для расчета сложных задач!

image

8 голосов
/ 13 апреля 2009

Другой пример:

Предположим, я создал неизменный класс Rectangle:

class Rectangle {
 public:
  Rectangle(int width, int height) : width_(width), height_(height) {}
  int width() const { return width_; }
  int height() const { return height_; }

 private:
  int width_;
  int height_;
}

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

Хорошая абстракция обычно подразумевает хорошую инкапсуляцию.

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

7 голосов
/ 08 июня 2015

Абстракция: Абстракция означает показать What часть функциональности.

Инкапсуляция: Инкапсуляция означает скрытие How части функциональности.

Давайте рассмотрим очень простой пример

/// <summary>
/// We have an Employee class having two properties EmployeeName and EmployeeCode
/// </summary>
public class Employee
{
    public string EmplpyeeName { get; set; }
    public string EmployeeCode { get; set; }

    // Add new employee to DB is the main functionality, so are making it public so that we can expose it to external environment
    // This is ABSTRACTION
    public void AddEmployee(Employee obj)
    {
        // "Creation of DB connection" and "To check if employee exists" are internal details which we have hide from external environment
        // You can see that these methods are private, external environment just need "What" part only
        CreateDBConnection();
        CheckIfEmployeeExists();
    }


    // ENCAPLUSATION using private keyword
    private bool CheckIfEmployeeExists()
    {
        // Here we can validate if the employee already exists
        return true;
    }

    // ENCAPLUSATION using private keyword
    private void CreateDBConnection()
    {
        // Create DB connection code
    }
}

Программный класс консольного приложения

class Program
{
    static void Main(string[] args)
    {
        Employee obj = new Employee();
        obj.EmplpyeeName = "001";
        obj.EmployeeCode = "Raj";

        // We have exposed only what part of the functionality
        obj.AddEmployee(obj);
    }
}
7 голосов
/ 17 октября 2011

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

Акт представления существенных признаков без включения подробностей фона или объяснений известен как абстракция

5 голосов
/ 13 июля 2015

Абстракция --- Скрытие реализации - на этапе проектирования --- Использование интерфейса / абстрактные вычисления

Инкапсуляция - Сокрытие данных - При разработке --- Использование модификаторов доступа (публичный / приватный)

5 голосов
/ 03 ноября 2011

Давайте возьмем пример стека. Это может быть реализовано с использованием массива или связанного списка. Но поддерживаемые им операции - push и pop.

Теперь абстракция выставляет только интерфейсы push и pop. Базовое представление скрыто (это массив или связанный список?) И предоставляется четко определенный интерфейс. Теперь, как вы обеспечиваете отсутствие случайного доступа к абстрагированным данным? Вот где приходит encapsulation . Например, классы в C ++ используют спецификаторы доступа, которые обеспечивают предотвращение случайного доступа и изменения. А также, сделав вышеупомянутые интерфейсы общедоступными, это гарантирует, что единственный способ манипулировать стеком - через четко определенный интерфейс. В процессе он объединил данные и код, который может ими манипулировать (давайте не будем вовлекать здесь функции-друзья). То есть код и данные связаны вместе или связаны или инкапсулированы.

5 голосов
/ 01 июня 2011

Инкапсуляция - это сложность в одной капсуле, которая является классом и, следовательно, Инкапсуляция ... В то время как абстракция - это характеристика объекта, которая отличается от другого объекта ...

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

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

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

...