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

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

Ответы [ 39 ]

1 голос
/ 23 апреля 2017

Позвольте мне попробовать это с простым примером кода

Абстракция = скрытие данных + инкапсуляция

 // Abstraction
    interface IOperation
    {
        int GetSumOfNumbers();
    }
    internal class OperationEven : IOperation
    {
        // data hiding
        private IEnumerable<int> numbers;

        public OperationEven(IEnumerable<int> numbers)
        {
            this.numbers = numbers;
        }
        // Encapsulation
        public int GetSumOfNumbers()
        {
            return this.numbers.Where(i => i % 2 == 0).Sum();
        }
    }
1 голос
/ 04 августа 2018

Абстракция и инкапсуляция оба известны для сокрытия данных. Но есть большая разница.

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

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

Инкапсуляция решает проблему на уровне реализации.

В классе вы можете скрыть данные с помощью модификаторов частного или защищенного доступа.

Абстракция

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

Абстракция решает проблему на уровне проектирования.

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

В ruby ​​вы можете добиться абстракции, создавая модули.

Пример: Мы используем (собирать, отображать, уменьшать, сортировать ...) методы модуля Enumerable с Array и Hash в ruby.

1 голос
/ 18 апреля 2017

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

    // Abstraction
    interface IOperation
    {
        int SquareNumber();
    }

    public class Operation
    {
        // Data hiding
        private int number;

        public Operation(int _number)
        {
            this.number = _number;
        }

        // Encapsulation
        public int SquareNumber()
        {
            return number * number;
        }
    }

В действии,

IOperation obj = new Operation(2); 
// obj.number  <--- can't access because hidden from world using private access modifier but not encapsulated. 
obj.SquareNumber(); // cannot access internal logic to calculate square because logic is hidden using encapsulation.
0 голосов
/ 22 октября 2018

Абстракция

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

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

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

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

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

В этом случае все приватные методы являются внутренними функциями, а приватные поля, такие как «Piston p1», являются внутренними данными, которые пользователю не нужно знать.

public class Car{

    private void startMotor(){ //do something }
    private void generateVoltage(){ //do something }
    private void sparkPlugIgnition(){ //do something }
    private void fuelFlowFromTankToInjector(){ //do something }
    private void pushPistonsDown() { 
               p1.doAction();
               p2.doAction();
               //do something    }
    private void moveCrankShaft(){ //do something }

    private Piston p1;
    private Piston p2;

    public void turnKey(){
        startMotor();
        generateVoltage();
        sparkPlugIgnition();
        fuelFlowFromTankToInjector();
        pushPistonsDown();
        moveCrankShat();
        ...
    }
}
0 голосов
/ 18 октября 2018

Короче говоря:

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

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

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

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

Абстракция предоставляет вам обобщенное представление о ваших классах.

0 голосов
/ 23 апреля 2015

Есть различия между

ABSTRAACTION

и

Инкапсулирование

1.    First difference between Abstraction and Encapsulation is that, Abstraction is implemented in Java using interface and abstract class while Encapsulation is implemented using private, package-private and protected access modifier.

2.    Data abstraction simply means generalizing something to hide the complex logic that goes underneath where Encapsulation is DATA HIDING.


3.    Encapsulation is combining related logic data (variables and methods) where as Abstraction is hiding internal implementation details and expose only relevant details to the user. In a way you can Abstraction is achieved by Encapsulation.

enter image description here

0 голосов
/ 12 апреля 2016

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

.
0 голосов
/ 27 ноября 2015

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

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

...