Что именно подразумевают разработчики под словом "Абстракция", когда дело касается ООП?
Абстракцией можно назвать некоторую сущность, которая не является отражением объекта реального мира (как с абстрактным искусством, что-то "абстрактное"). Пример - Чистая выдумка из GRASP.
Также абстракцией можно назвать в принципе любой класс, т.к. классы в программном обеспечении имеют лишь ту детализацию, которая необходима в контексте задачи, решаемой этим программным обеспечением. Т.е. это что-то, обладающее только необходимыми в контексте задачи функциями, остальное же опускается.
Ещё абстракцией можно назвать, например, интерфейс. Методы интерфейса не содержат реализацию, они лишь описывают то, как с сущностью реализующей этот интерфейс можно взаимодействовать. Т.е. в данном контексте абстракция, это некоторый контур, набросок, который не содержит конкретики.
Читаешь форумы, книги, чаты, статьи, и не покидает мысль, что разработчики на ОО языках общаются будто 2 поставленные рядом умные колонки. Вроде что-то говорят, но ощущение, что говорят о разном, т.к. каждый строит мысль относительно своего понимания терминологии, в том числе абстракции.
потому интерфейс и является чистой абстракцией: мы обозначаем и выносим видимые признаки через методы (поведение), обозначаем названием
при использовании интерфейсов мы прячем реализацию (инкапсуляция), мы можем реализовать абстракцию различным конкретным кодом (полиморфизм) в бесконечном множестве вариантов и можем абстрагировать общие черты (наследование интерфейса), вынося на уровень выше в др сущности
При наследовании поведения у нас есть наследвоание интерфейса, потому наследование как пример для разных штук приводить нужно аккуратно
Не претендую на истину в последней инстанции, но в моей голове это выглядит так:
Абстракция - это некоторое обобщение. Например, есть кошка, собака и попугай. Мы можем ввести абстракцию "домашние животные". Добавив в эту конструкцию волка и рысь мы можем ввести абстракцию "дикие животные". А затем ввести абстракцию "животные". А затем "живые существа" и т.д.
В объектно-ориентированном программировании абстракции принимают форму абстрактных классов и интерфейсов.
В обобщенном программировании абстракции принимают форму шаблонных классов и функций.
В функциональном программировании абстракции принимают форму функций высшего порядка.
"Чистая выдумка" - с моей точки зрения это не абстракция, это лишь способ выделения ответственности в отдельный класс. Но эта самая ответственность вполне конкретна.
Классы - тем более не абстракция. При любом моделировании мы переносим в модель существенные черты моделируемого явления (системы) и отбрасываем несущественные. То о чем вы говорите - неизбежная потеря деталей при построении модели.
Абстракция в ООП - это возможность абстрагироваться от того кода, который внутри класса, и работать только с тем, который снаружи (интерфейсом).
Пусть будут те же кошки и собаки (пишем тамагочи). Которые подают голос, проигрывая звуковой файл, и у которых процесс кормления и выгуливания меняет какие-то внутренние переменные. Создав интерфейс, которому подчиняются оба класса, в вызывающем его коде вы ничего не должны знать об этих файлах и переменных - только то, что кошку с собакой можно покормить, выгулять и выслушать. Абстрагируясь от низкоуровневых деталей, занимаясь более высокоуровневой логикой. Например, не проверяя, не надет ли на кошку намордник на прогулке, а просто спрашивая сам класс, все ли нормально. Спрятав детали внутрь абстракции.
Допустим с интерфейсом понятно. А если взять во внимание абстрактный класс, в котором есть общий для цепочки наследников функционал? Если с помощью интерфейса мы выделяем некоторые общие публичные методы, через которые вызывающий код будет взаимодействовать с реализующим интерфейс объектом, то в методе абстрактного класса мы выделяем некоторую общую функциональность для всей цепочки наследников. И там и там выделяем общее, или это просто игра слов?
random55, вы опять говорите о методах достижения абстракции. Абстракция - просто возможность выкинуть из головы лишние детали и работать так, как будто их вовсе не существует. Да, для этого есть разные приемы и методы.
Adamos, свожу всё к методам, видимо, потому, что слабо развито абстрактное мышление. Мне очень тяжело даётся выделение абстракций, декомпозиция требований, распределение ответственностей :( Мозг будто всегда в поиске конкретного решения, хотя опыт разработки какой-никакой за плечами имеется. Беда.
random55, это нормальная ситуация для процедурщика. Постепенно накопится опыт абстрагирования от реализации, применения красивых и слабо связанных с остальным кодом решений.
Абстрактный класс в ООП - это не законченный класс, на основе которого нельзя создать объект, т.к. не всё описано.
Например, как уже писали в ответах, возьмём класс "животное". Мы можем описать в нём общие для всех животных вещи, например методы перемещения или свойства "вид" или "биологический класс". Мы не можем инициализировать такой объект, т.к. нет просто существа "животное". А вот унаследованный класс "собака" от абстрактного класса "животное" можно создать. При этом мы можем иметь один список "животных" и обращаться к общим методам и свойствам, которые описаны в абстрактном классе.
Абстрактный класс, как и интерфейс требует от дочернего класса реализовать всё, что описано в абстрактном классе, но не имплементировано, однако, может иметь и описанные готовые методы и свойства.