Різниця між інкапсуляцією та абстракцією


87

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

Я відповів їй наскільки мені відомо, що інкапсуляція полягає в основному для зв’язування членів даних та функцій членів в єдиний блок, який називається Class . Тоді як абстракція в основному полягає в тому, щоб приховати складність впровадження та забезпечити легкий доступ для користувачів. Я думав, що з моєю відповіддю вона буде добре. Але вона запитала: якщо метою обох є приховати інформацію, то в чому насправді різниця між цими двома? Я не міг дати їй жодної відповіді.

Перш ніж задавати це питання, я прочитав інші теми на StackOverFlow про різницю між цими двома концепціями ООП . Але я не знаходжу себе в змозі переконати інтерв'юера.

Хтось може обґрунтувати це найпростішим прикладом?


13
і нарешті, ти отримав роботу? :)
Адріан Ксьєрчик

1
@WPFbee Нещасний!
Aimal Khan

3
Не знаю, чому люди порівнюють абстракцію та інкапсуляцію. Чому ми не можемо прийняти їх як дві різні концепції ООП.
Mr ASquare


@WpfBee Абстракція не має нічого спільного з приховуванням, просто
S

Відповіді:


74

Інкапсуляція приховує змінні або якусь реалізацію, яку можна так часто змінювати в класі, щоб запобігти безпосередньому доступу сторонніх людей. Вони повинні отримати до нього доступ за допомогою методів getter та setter.

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


7
Ідеально Мені здається, що ваша відповідь стосується лише мого запитання інтерв'юера. Я намагаюся повторити вашу відповідь на практичному прикладі. Будь ласка, повідомте мене, якщо це виправдовує вашу відповідь. Візьмемо приклад з телебачення. Інкапсуляція - це внутрішні схеми, світлодіоди тощо, що поєднують у собі телевізор. Абстракція - це кнопки увімкнення-вимкнення, звуку, налаштування каналу та інших кнопок, передбачених для його управління.
WpfBee 02.03.13

Хлопці абстракція не має нічого спільного з приховуванням реалізації ... абстракція - це метод поліморфної взаємодії з класом
Mortalus

1
@Mortalus - Я не згоден з вашим 1-м твердженням "абстракція не має нічого спільного з приховуванням реалізації". Я думаю, коли ми починаємо вивчати концепцію абстракції, перше, чого нас навчають, - це те, що ми приховуємо складність реалізації та надаємо користувачеві якийсь інтерфейс для її використання. Оскільки користувача може не цікавити складність реалізації. Ви можете взяти практичний приклад телевізора або змінного струму. Інша справа, що якщо це не приховує реалізації, то чому ми надаємо метод в абстрактному класі, який не має тіла. Ми чітко приховуємо тут реалізацію.
WpfBee 02.03.13

1
@Mortalus - Ви також згадали вікі-посилання. Це перше твердження - "В інформатиці абстракція - це процес, за допомогою якого дані та програми визначаються з поданням, подібним за формою до свого значення (семантика), при цьому приховуючи деталі реалізації. Абстракція намагається зменшити та розкласти деталі так, що програміст може зосередитись на кількох концепціях одночасно ". саме по собі припускає, що Абстракція покликана приховати реалізацію. Я згоден з вашим 2-м твердженням, але не з 1-м.
WpfBee 02.03.13

1
Я думаю, що Інкапсуляція - це просто більше побудови єдиної одиниці, мало що стосується того, приховуєте ви це чи ні. Якщо абстракція стосується більше приховування речей, виправте, якщо я помиляюся.
raj240


12

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

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

Це загальна відповідь, не пов’язана з певною мовою програмування (як було питання). Тож відповідь така: абстракція та інкапсуляція не мають нічого спільного. Але їх реалізації можуть стосуватися один одного (скажімо, на Java: інкапсуляція - деталі приховані в класі, Абстракція - деталі взагалі відсутні в класі або інтерфейсі).


11

Інкапсуляція: Обгортання коду та даних у єдине ціле. Classє прикладом інкапсуляції, оскільки він обгортає метод і властивість.

Абстракція: приховування внутрішніх деталей та показ лише функціональності. Абстракція фокусується на тому, що робить об’єкт, а не на тому, як це робить. Це забезпечує узагальнений погляд на класи.

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

Тут ToString () - абстракція. І те, як ця numberзмінна механізму перетворюється на рядок та ініціалізується в aStringNumberце інкапсуляція.

Візьмемо реальний приклад калькулятора. Інкапсуляція - це внутрішні схеми, акумулятор тощо, які поєднують у собі калькулятор. Абстракція - це різні кнопки, такі як увімкнення-вимкнення, очищення та інші кнопки, передбачені для управління нею.


7

Абстракція: Зазвичай це робиться для забезпечення поліморфного доступу до набору класів. Абстрактний клас неможливо створити за допомогою інстанції, тому інший клас повинен буде виводитись із нього, щоб створити більш конкретне уявлення.

Типовим прикладом використання абстрактного класу може бути реалізація шаблону дизайну шаблонного методу, де вводиться абстрактна точка введення, щоб конкретний клас міг реалізувати її по-своєму "конкретно".

див .: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

Інкапсуляція: Це процес приховування складності реалізації певного класу від клієнта, який збирається його використовувати, майте на увазі, що "клієнтом" може бути програма чи подія особи, яка написала клас.

див .: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)


1
абстракція пов'язана з абстрактним класом ??
вішну вішванат

@vishnuviswanath, так, ми можемо реалізувати абстракцію за допомогою абстрактного класу та інтерфейсів.
invzbl3

3

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

Ось висновок із статті:

Абстракція, приховування інформації та інкапсуляція - це дуже різні, але дуже пов’язані поняття. Можна стверджувати, що абстракція - це техніка, яка допомагає нам визначити, яка конкретна інформація повинна бути видимою, а яка - прихованою. Тоді інкапсуляція - це техніка упаковки інформації таким чином, щоб приховати те, що слід приховувати, і зробити видимим те, що має бути видимим.


2

різниця в обох полягає лише в інкапсуляції точки перегляду,
яке використовується для приховування даних, якщо наша мета - запобігти тому, щоб клієнт бачив усередині нашого логічного погляду

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

Зовнішній вигляд означає, що припустимо

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

тут ми використовуємо підкачку у сортуванні за допомогою міхура, щоб просто показати нашому клієнтові, яку логіку ми застосовуємо. Якщо ми замінимо підкачку (x, y) цілим кодом тут, в одному випадку він / вона не може зрозуміти нашу логіку


2

Так, це правда, що абстракція та інкапсуляція - це приховування.

  • Використання лише відповідних деталей та приховування непотрібних даних на рівні проектування називається абстракцією . (На зразок вибору лише відповідних властивостей для класу "Автомобіль", щоб зробити його більш абстрактним або загальним.)

  • Інкапсуляція - це приховування даних на рівні реалізації . Наприклад, як насправді приховати дані від прямого / зовнішнього доступу. Це робиться шляхом прив’язки даних та методів до одного об’єкта / одиниці, щоб запобігти зовнішньому доступу. Таким чином, інкапсуляція також відома як приховування даних на рівні реалізації.


3
Чи можете ви пояснити, чим ця відповідь відрізняється від 12 інших існуючих відповідей?
Стівен Раух,

2

Інкапсуляція:

Щось приховуючи, щось на зразок капсули з ліками. Ми не знаємо, що знаходиться в капсулі, ми просто беремо її. Так само, як і при програмуванні - ми просто приховуємо якийсь спеціальний код методу або властивості, і він видає лише результат, такий же, як капсула. Коротше кажучи, інкапсуляція приховує дані.

Абстракція:

Абстракція означає приховування логіки або реалізації. Наприклад, ми приймаємо таблетки і бачимо їх колір, але не знаємо, яка мета цього і як це працює з тілом.


0

Абстракція

На Java абстракція означає приховування інформації до реального світу. Він встановлює договір між стороною про те, що "що нам робити, щоб скористатися послугою".

Наприклад, при розробці API, лише абстрактна інформація сервісу була розкрита світові, а не фактична реалізація. Інтерфейс у Java може допомогти досягти цієї концепції дуже добре.

Інтерфейс забезпечує договір між сторонами, наприклад, виробником та споживачем. Виробник виробляє товар, не повідомляючи споживачеві, як виготовляється товар. Але через інтерфейс Виробник повідомляє усім споживачам, який товар можна купити. За допомогою абстракції виробник може продавати товар своїм споживачам.

Інкапсуляція:

Інкапсуляція - це один рівень абстракції. Одна і та ж компанія намагається захистити інформацію одна від одної виробничої групи. Наприклад, якщо компанія виробляє вино та шоколад, інкапсуляція допомагає захищати інформацію про те, як кожен продукт виготовляється один від одного.

  1. Якщо у мене є окремий пакет для вина та інший для шоколаду, і якщо всі класи оголошені в пакеті як модифікатор доступу за замовчуванням, ми надаємо інкапсуляцію рівня пакету для всіх класів.
  2. У межах пакету, якщо ми оголошуємо кожен поданий клас (поле-член) приватним і маємо відкритий метод доступу до цих полів, таким чином надаючи інкапсуляцію на рівні класу цим полям

0

Ще кілька моментів, щоб все зрозуміти,

Не можна плутати абстракцію даних та абстрактний клас. Вони різні.

Як правило, ми говоримо, що абстрактний клас або метод - це в основному щось приховувати. Але ні .. Це неправильно. Що означає слово абстрактне? Пошук у Google говорить, що англійське слово абстракція означає

"Існує в думках або як ідея, але не має фізичного чи конкретного існування".

І це правильно у випадку абстрактного класу теж. Він не приховує зміст методу, але вміст методу вже порожній (не має фізичного чи конкретного існування), але він визначає, яким повинен бути метод (існуючий в думці чи як ідея), або метод повинен бути в калькуляції .

То коли ви насправді використовуєте абстрактні методи?

  • Коли метод із базового класу буде відрізнятися в кожному дочірньому класі, який його розширює.
  • І тому ви хочете переконатись, що дочірній клас має цю функцію.
  • Це також гарантує, що метод, щоб мати обов'язковий підпис, наприклад, він повинен мати n кількість параметрів.

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

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

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

Абстрактний метод у класі змушує дочірній клас напевно реалізувати цю функцію із наданим підписом!


0

Дозвольте пояснити це на тому ж прикладі, який обговорювався вище. Будь ласка, розгляньте той самий телевізор.

Інкапсуляція : корисні налаштування, які ми можемо зробити за допомогою пульта дистанційного керування, є гарним прикладом - гучність вгору / вниз, колір і контраст - все, що ми можемо зробити, це налаштувати його на мінімальне та максимальне значення, і не може зробити нічого, крім того, що передбачено на пульті дистанційного керування - Уявіть тут гетер та сеттер (функція сеттера перевіряє, чи вказане значення є дійсним, якщо так, він обробляє операцію, якщо ні, не дозволяє нам вносити зміни - як ми не можемо зменшити гучність за нуль, навіть якщо ми натискаємо гучність вниз сто разів).

Абстракція : Ми можемо взяти той самий приклад тут, але з вищим ступенем / контекстом. Кнопка зменшення гучності зменшить гучність - і це інформація, яку ми надаємо користувачеві, і користувач не знає ні про інфрачервоний передавач всередині пульта, ні про приймач телевізора і про подальший процес синтаксичного аналізу сигналу та мікропроцесора архітектура всередині телевізора. Простіше кажучи, це не потрібно в контексті - просто надайте те, що необхідно. Тут можна легко зв’язати визначення підручника, тобто, приховуючи внутрішню реалізацію і надаючи лише те, що вона буде робити, а не те, як це робити!

Сподіваюся, це трохи прояснить!


0

Якщо я був тим, хто стикався з інтерв'ю, я б сказав, що як абстракція та інкапсуляція перспективи кінцевого користувача є досить однаковими. Це не що інше, як приховування інформації. Як перспектива розробника програмного забезпечення, Abstraction вирішує проблеми на рівні проектування, а Encapsulation - на рівні реалізації.


0

Коротко, Abstractionце відбувається на рівні класу, приховуючи реалізацію та реалізуючи інтерфейс, щоб мати можливість взаємодіяти з екземпляром класу. Беручи до уваги,Encapsulation використовується для приховування інформації; наприклад, зробити приватні змінні членами, щоб заборонити прямий доступ, та надати їм геттери та сетери для непрямого доступу.


0

Так !!!! Якщо я кажу, інкапсуляція - це свого роду вдосконалена конкретна абстракція ,

Скільки з вас прочитали / підтримали мою відповідь. Давайте розкопаємось, чому я кажу так.

Мені потрібно прояснити дві речі перед тим, як заявити претензію.

Один - приховування даних, а інший - абстракція

Приховування даних

Здебільшого ми не надаємо прямого доступу до наших внутрішніх даних. Наші внутрішні дані не повинні виходити безпосередньо, оскільки стороння особа не може отримати безпосередній доступ до наших внутрішніх даних. Вся справа в безпеці, оскільки нам потрібно захищати внутрішні стани певного об’єкта.


Абстракція

Для простоти приховування внутрішніх реалізацій називається абстракцією. В абстракції ми зосереджуємось лише на необхідних речах. В основному, ми говоримо про те, "що робити", а не "як робити" в абстракції. Безпеки також можна досягти абстракцією, оскільки ми не збираємося виділяти "як ми реалізуємо". Ремонтність буде збільшена, оскільки ми можемо змінити реалізацію, але це не вплине на нашого кінцевого користувача.


Я сказав: "Інкапсуляція - це свого роду вдосконалена абстракція конкретного обсягу". Чому? тому що ми можемо розглядати інкапсуляцію як приховування даних + абстракцію

інкапсуляція = приховування даних + абстракція

При інкапсуляції нам потрібно приховувати дані, щоб стороння особа не бачила дані, і нам потрібно надати методи, які можна використовувати для доступу до даних. Ці методи можуть мати перевірки чи інші особливості всередині тих речей, які також приховані стороннім. Отже, тут ми приховуємо реалізацію методів доступу, і це називається абстракцією.

Ось чому я сказав, що подібне вище інкапсуляція - це свого роду абстракція.

То де різниця ?

Різниця полягає в тому, що абстракція є загальною, якщо ми приховуємо щось від користувача для простоти, ремонтопридатності та безпеки, і,

інкапсуляція - це конкретна, яка пов’язана з безпекою внутрішніх станів, де ми приховуємо внутрішній стан (приховування даних), і ми пропонуємо методи доступу до даних, а ці способи реалізації також приховані від зовнішньої особи (абстракція).


-2

Абстракція: які мінімальні функції та змінні повинні бути піддані зовнішньому впливу нашого класу.

Інкапсуляція: як досягти цієї вимоги, тобто як її реалізувати.


Інкапсуляція не є способом досягнення абстракції. Це 2 дещо різні поняття, але вони мають тонкий зв’язок.
varsh

я думаю, що обидва поняття не різні, без u можна досягти інкапсуляції з абстрактним класом.
K Kishore Kumar Reddy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.