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


person wantSTUDY    schedule 29.07.2010    source источник
comment
На этот вопрос есть довольно хорошие ответы.   -  person Hans Olsson    schedule 29.07.2010
comment
инкапсуляция означает сокрытие данных, например, с помощью геттера и сеттера и т. д. Абстракция означает сокрытие реализации с использованием абстрактного класса и интерфейсов и т. д.   -  person NoNaMe    schedule 27.11.2012
comment
возможный дубликат точной разницы между инкапсуляцией и абстракцией   -  person NoNaMe    schedule 28.11.2012


Ответы (4)


Образец:

// NO ABSTRACTION, NO ENCAPSULATION
const int catLegs = 4;
const int spiderLegs = 8;

Leg[] catLegs;
Leg[] spiderLegs;

void MakeCatRun(Distance b) { for (int i=0; i<catLegs; ++i) catLegs[i] += b; }
void MakeSpiderRun(Distance b) { for (int i=0; i<spiderLegs; ++i) spiderLegs[i] += b; }

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

// ENCAPSULATION
class Cat
{
    Leg[] legs;
    int nLegs;

    public void Run(Distance b) { for (int i=0; i < nLegs; ++i) leg[i] += b; }
}

class Spider
{
    Leg[] legs;
    int nLegs;

    public void Run(Distance b) { for (int i=0; i < nLegs; ++i) leg[i] += b; }
}

Абстракция:

 // ABSTRACTION
    class LivingBeing
    {
        Leg[] legs;
        int nLegs;

        public void Run(Distance b) { for (int i=0; i < nLegs; ++i) leg[i] += b; }
    }

    class Cat: LivingBeing       {        }

    class Spider: LivingBeing   {    }
person Grozz    schedule 29.07.2010
comment
Из вашего примера кажется, что абстракция - это не что иное, как перемещение общих свойств в другой класс - person Anil Purswani; 22.05.2012

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

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

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

Итак, инкапсуляция фактически обеспечивает абстракцию!

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

 class Sorter
 {
  public List<Integer> Sort(List<Integer>)//Only this method is seen outside
  {
    String pattrenName=this.AdvancedPatternFinder();
    this.Advancedsorter(pattenName);
    //Return sorted list
  } 
  private String AdvancedPatternFinder(){}//NOT seen from outside
  private void Advancedsorter(String pattrenName){}//NOT seen from outside
 }

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

изображение любезно предоставлено: этот блог

введите описание изображения здесь

person WinW    schedule 02.06.2011
comment
В комментарии к коду вы сказали Only this method is seen outside. Как этот метод выдается внешнему миру. Это через исходный код или некоторую документацию API? - person nitin_cherian; 09.01.2012
comment
@LinuxPenseur помечен как общедоступный и, следовательно, видимый за пределами класса по соглашению - person WinW; 06.02.2012

Инкапсуляция означает, что внутреннее состояние объекта (данные) может быть изменено только его общедоступными методами (общедоступным интерфейсом):

class Encapsulated  {
  private int data;

  public int getData()  { return data; }
  public void setData(int d) { data = d; }
}

Абстракция означает, что вы можете абстрагироваться от конкретных реализаций, например:

abstract class Container  {
  int getSize();
}

class LinkedList extends Container {
  int getSize() { /* return the size */ }
}

class Vector extends Container {
  int getSize()  { /* ... */ }
}

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

person Karel Petranek    schedule 29.07.2010

Эти два понятия различны, но тесно связаны и часто встречаются вместе.

Абстракция - это скрытие несущественных деталей, обычно называемых деталями реализации. Например, для чтения данных из потока в большинстве сред используется концепция InputStream. Он предоставляет метод ReadBytes () для извлечения большего количества байтов из потока. То, как это происходит, абстрагируется - это может быть чтение из файла с использованием API файлов ОС или чтение из сокета, из SSH или чего-либо еще, что может быть представлено как поток байтов. Класс InputStream называется абстракцией.

Каждая реализация InputStream кодирует способ чтения байтов. Например, FileInputStream считывает байты из файла и поддерживает текущее смещение в файле как частный член данных. Код, внешний по отношению к классу, не имеет свободного доступа для чтения или записи этой переменной напрямую - это может привести к неверным результатам, например к пропуску или повторному чтению части потока. Это особенно важно в многопоточных сценариях, когда необходимо тщательно контролировать изменения переменной. Вместо предоставления неограниченного доступа класс использует offset внутри (объявляя его private) и предоставляет внешнему коду только косвенный доступ, например, через метод GetCurrentOffset() и методы Seek(int offset). Затем переменная смещения инкапсулируется классом FileInputStream.

person mdma    schedule 29.07.2010