@frontjss

Для чего абстракции в ООП?

Как реализовать абстрактный класс я понял

Но суть мне не ясна, что мы сможем сделать с ним чего не сможем с другими?

Суть его на практике пожалуйста объясните

Спасибо большое!
  • Вопрос задан
  • 265 просмотров
Пригласить эксперта
Ответы на вопрос 3
HemulGM
@HemulGM
Delphi Developer, сис. админ
Абстрактный класс нужен для того, чтобы обеспечить двум или более другим классам, которые будут наследовать его, одинаковый доступ к некоторым методам, не реализовывая эти методы в абстрактном классе.
Например, у тебя есть два класса "яблоко" и "апельсин".

И теперь, ты хочешь их "съесть"
Ты взываешь "яблоко1.съесть" и "апельсин1.съесть". Всё классно. Но, эти два объекта не от одного предка и нельзя в точности сказать, что оба объекта на самом деле имеют метод "съесть".

Если это понятно, то давай далее.
Абстрактный метод позволяет НЕ писать определение метода, а лишь его заголовок.

Не знаю точно как это в питоне. Но, в обычном классе ты должен описать метод (допустим оставив пустым) и затем наследовать от него другие классы. В то время как в абстрактном классе реализация метода не нужна, достаточно сказать, что метод там есть и он должен быть реализован во всех наследуемых классах, а так же, нельзя создать объект на основе абстрактного класса.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D...

Например, чтобы сделать несколько специализированных классов со специфичными методами/свойствами, но не дублировать все базовые (одинаковые свойства), которые выносим в абстрактный класс и наследуем от него
Ответ написан
Абстра́кция (лат. abstractio — отвлечение) — теоретическое обобщение как результат абстрагирования.

Пример близкий к реальности:
Есть массив чисел и очередь из сообщений.

Нужно сделать две функции-фильтра - первый пусть вытащит из массива только чётные числа, которые больше 0, а второй вытащит из очереди только свежие сообщения с высоким приоритетом.

Вариант без абстракций:
пишем две независимые функции для каждого типа объектов.

Вариант с абстракциями:
  1. Создаём абстракцию для нашей задачи: "Дана коллекция из элементов, нужно создать новую коллекцию и поместить в неё только те элементы, которые удовлетворяют некоторому данному условию".
  2. Выделяем из условия две новые абстракции: Коллекция элементов и Условие (предикат).
  3. Создаём функцию, которая будет принимать себе как аргумент коллекцию элементов и некоторый предикат
  4. Реализуем интерфейс предиката - "число чётное и больше 0" и "сообщение свежее и важное"

Результат: Мы изобрели функцию filter
const array = [-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const predicate = num => num > 0 && num % 2 === 0;
const result = array.filter(predicate);

Вариант с абстракциями выглядит сложнее (так и есть) и заставляет больше думать на этапе проектирования, но позволяет избежать дублирования кода и, иногда, упростить работу с кодом.

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

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

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