Возможный дубликат:
Абстракция VS Скрытие информации VS инкапсуляция < / а>
Может ли кто-нибудь объяснить мне основные различия между принципами инкапсуляции и абстракции в объектно-ориентированном программировании (если возможно, на примерах).
Возможный дубликат:
Абстракция VS Скрытие информации VS инкапсуляция < / а>
Может ли кто-нибудь объяснить мне основные различия между принципами инкапсуляции и абстракции в объектно-ориентированном программировании (если возможно, на примерах).
Образец:
// 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 { }
Абстракция - это качество, при котором мы просто не беспокоимся о ненужных внутренних механизмах (реализациях) и можем иметь дело с системой / объектом, обращая внимание на существенное.
Например: при торможении автомобиля вам просто все равно, есть ли у него пневматический или гидравлический тормоз. Здесь абстракция проявляется в виде нажатия на педаль.
Инкапсуляция - это то, что делает вышеперечисленное (абстракцию) возможным путем упаковки (инкапсуляции) деталей реализации в контейнер (скрывая механизмы разрушения и крошечные компоненты от вашего зрения или физического контакта, в приведенном выше 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
}
См. Приведенную ниже анимацию, чтобы понять, как создается аккуратная абстракция за счет инкапсуляции внутренних деталей внутри!
изображение любезно предоставлено: этот блог
Only this method is seen outside
. Как этот метод выдается внешнему миру. Это через исходный код или некоторую документацию API?
- person nitin_cherian; 09.01.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) без изменения какого-либо кода, тем самым абстрагируясь от выполнение.
Эти два понятия различны, но тесно связаны и часто встречаются вместе.
Абстракция - это скрытие несущественных деталей, обычно называемых деталями реализации. Например, для чтения данных из потока в большинстве сред используется концепция InputStream
. Он предоставляет метод ReadBytes () для извлечения большего количества байтов из потока. То, как это происходит, абстрагируется - это может быть чтение из файла с использованием API файлов ОС или чтение из сокета, из SSH или чего-либо еще, что может быть представлено как поток байтов. Класс InputStream называется абстракцией.
Каждая реализация InputStream кодирует способ чтения байтов. Например, FileInputStream считывает байты из файла и поддерживает текущее смещение в файле как частный член данных. Код, внешний по отношению к классу, не имеет свободного доступа для чтения или записи этой переменной напрямую - это может привести к неверным результатам, например к пропуску или повторному чтению части потока. Это особенно важно в многопоточных сценариях, когда необходимо тщательно контролировать изменения переменной. Вместо предоставления неограниченного доступа класс использует offset
внутри (объявляя его private
) и предоставляет внешнему коду только косвенный доступ, например, через метод GetCurrentOffset()
и методы Seek(int offset)
. Затем переменная смещения инкапсулируется классом FileInputStream.