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

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

Ответы [ 39 ]

4 голосов
/ 01 февраля 2014

С это

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

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

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

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

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

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

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

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

4 голосов
/ 10 декабря 2016

Следующий абзац помог мне понять, чем они отличаются друг от друга:

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

Вы можете прочитать больше здесь .

4 голосов
/ 18 ноября 2014

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

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

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

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

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

А абстракция это -

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

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

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

Customer Screen GUI

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

Шаг - 1: Что нужно моему клиентскому классу?

* * Тысяча сорок-одиной т.е.
  • 2 переменные для хранения кода клиента и имени клиента.
  • 1 Функция для добавления кода клиента и имени клиента в базу данных.

    namespace CustomerContent { Заказчик публичного класса { публичная строка CustomerCode = ""; публичная строка CustomerName = ""; public void ADD () { // мой код БД будет здесь }

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

Шаг -2: Как будет работать валидация, функция ДОБАВИТЬ?

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

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: Приватные дополнительные и сложные методы, не включающие взаимодействие с конечным пользователем.

Таким образом, делая метод Complicated и Extra закрытым вместо Public (то есть скрывая эти методы) и удаляя 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. - Код выше сложен и быстр.

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

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

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

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

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

2 голосов
/ 20 апреля 2017

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

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

Мы выставляем все НЕОБХОДИМЫЕ правила (методы) в абстракции , реализация правил оставлена ​​для сущностей реализатора, также реализация не является частью абстракции. Именно абстракция подпись и делает абстракцию.

Encapsulation - это просто СКРЫТИЕ внутренних деталей за счет сокращения доступа к состояниям и поведению. Инкапсулированный класс может иметь или не иметь четко определенный Abstraction.

java.util.List - это абстракция для java.util.ArrayList. Внутренние состояния java.util.ArrayList, помеченные non public модификаторами доступа, являются инкапсуляцией.

Редактировать Предположим, класс Container.nava implements IContainer, IContainer может объявлять такие методы, как addElement, removeElements, contains и т. Д. Здесь IContainer представляет абстракцию для своего реализующего класса. Абстракция объявляет API класса, модуля или системы во внешний мир. Эти API становятся contract. Эта система может быть или может быть еще не разработана. Пользователи системы теперь могут зависеть от объявленных API-интерфейсов и уверены, что любая система, реализующая такой контракт, всегда будет придерживаться объявленных API-интерфейсов, они всегда будут обеспечивать реализацию tge для этих API-интерфейсов. Как только мы пишем какую-то конкретную сущность, тогда решение о том, чтобы скрыть наши внутренние состояния, - это инкапсуляция

2 голосов
/ 06 апреля 2011
class Aeroplane : IFlyable, IFuelable, IMachine
{ // Aeroplane's Design says:
  // Aeroplane is a flying object
  // Aeroplane can be fueled
  // Aeroplane is a Machine
}
// But the code related to Pilot, or Driver of Aeroplane is not bothered 
// about Machine or Fuel. Hence,
// pilot code:
IFlyable flyingObj = new Aeroplane();
flyingObj.Fly();
// fighter Pilot related code
IFlyable flyingObj2 = new FighterAeroplane();
flyingObj2.Fly();
// UFO related code 
IFlyable ufoObj = new UFO();
ufoObj.Fly();
// **All the 3 Above codes are genaralized using IFlyable,
// Interface Abstraction**
// Fly related code knows how to fly, irrespective of the type of 
// flying object they are.

// Similarly, Fuel related code:
// Fueling an Aeroplane
IFuelable fuelableObj = new Aeroplane();
fuelableObj.FillFuel();
// Fueling a Car
IFuelable fuelableObj2 = new Car(); // class Car : IFuelable { }
fuelableObj2.FillFuel();

// ** Fueling code does not need know what kind of vehicle it is, so far 
// as it can Fill Fuel**
2 голосов
/ 06 июля 2011

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

2 голосов
/ 08 декабря 2013

Процессы абстракции и инкапсуляции оба генерируют интерфейсы.

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

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

1 голос
/ 23 июня 2013

Я думаю, что Инкапсуляция - это способ реализации абстракции. Взгляните на следующую ссылку.

Абстракция и инкапсуляция

1 голос
/ 07 июня 2015

В короткий

Использование абстракции -> Инкапсуляция & Использование инкапсуляции -> сокрытие данных

OR

скрытие данных является подмножеством инкапсуляции и Инкапсуляция является подмножеством абстракции

Ссылка: http://www.tonymarston.co.uk/php-mysql/abstraction.txt

...