@random55

Что такое абстракция?

Что именно подразумевают разработчики под словом "Абстракция", когда дело касается ООП?

Абстракцией можно назвать некоторую сущность, которая не является отражением объекта реального мира (как с абстрактным искусством, что-то "абстрактное"). Пример - Чистая выдумка из GRASP.

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

Ещё абстракцией можно назвать, например, интерфейс. Методы интерфейса не содержат реализацию, они лишь описывают то, как с сущностью реализующей этот интерфейс можно взаимодействовать. Т.е. в данном контексте абстракция, это некоторый контур, набросок, который не содержит конкретики.

Читаешь форумы, книги, чаты, статьи, и не покидает мысль, что разработчики на ОО языках общаются будто 2 поставленные рядом умные колонки. Вроде что-то говорят, но ощущение, что говорят о разном, т.к. каждый строит мысль относительно своего понимания терминологии, в том числе абстракции.
  • Вопрос задан
  • 294 просмотра
Решения вопроса 2
@Akela_wolf
Extreme Programmer
Не претендую на истину в последней инстанции, но в моей голове это выглядит так:

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

В объектно-ориентированном программировании абстракции принимают форму абстрактных классов и интерфейсов.
В обобщенном программировании абстракции принимают форму шаблонных классов и функций.
В функциональном программировании абстракции принимают форму функций высшего порядка.

"Чистая выдумка" - с моей точки зрения это не абстракция, это лишь способ выделения ответственности в отдельный класс. Но эта самая ответственность вполне конкретна.
Классы - тем более не абстракция. При любом моделировании мы переносим в модель существенные черты моделируемого явления (системы) и отбрасываем несущественные. То о чем вы говорите - неизбежная потеря деталей при построении модели.
Ответ написан
Adamos
@Adamos
Абстракция в ООП - это возможность абстрагироваться от того кода, который внутри класса, и работать только с тем, который снаружи (интерфейсом).
Пусть будут те же кошки и собаки (пишем тамагочи). Которые подают голос, проигрывая звуковой файл, и у которых процесс кормления и выгуливания меняет какие-то внутренние переменные. Создав интерфейс, которому подчиняются оба класса, в вызывающем его коде вы ничего не должны знать об этих файлах и переменных - только то, что кошку с собакой можно покормить, выгулять и выслушать. Абстрагируясь от низкоуровневых деталей, занимаясь более высокоуровневой логикой. Например, не проверяя, не надет ли на кошку намордник на прогулке, а просто спрашивая сам класс, все ли нормально. Спрятав детали внутрь абстракции.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
HemulGM
@HemulGM
Delphi Developer, сис. админ
Абстрактный класс в ООП - это не законченный класс, на основе которого нельзя создать объект, т.к. не всё описано.

Например, как уже писали в ответах, возьмём класс "животное". Мы можем описать в нём общие для всех животных вещи, например методы перемещения или свойства "вид" или "биологический класс". Мы не можем инициализировать такой объект, т.к. нет просто существа "животное". А вот унаследованный класс "собака" от абстрактного класса "животное" можно создать. При этом мы можем иметь один список "животных" и обращаться к общим методам и свойствам, которые описаны в абстрактном классе.
Абстрактный класс, как и интерфейс требует от дочернего класса реализовать всё, что описано в абстрактном классе, но не имплементировано, однако, может иметь и описанные готовые методы и свойства.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы