Я помню себя, когда не въезжал во все эти абстрактные классы и в интерфейсы. Но всё же я уверен, что для начинающих ООП-программистов можно донести смысл всего это.
Смысл абстрактных методов - обязать разработчиков, которые будут наследоваться от абстрактного класса, реализовать конкретные методы, но при этом часть функционала за них уже реализована в этом абстрактном классе.
Например, нам нужно создать класс, который форматирует определённые данные в табличной форме с использованием разных цветов шрифта и выводит их в браузер. На этом этапе пока нужды в абстрактных классах и методах не видно.
Потом заказчик попросил обеспечить форматирование данных не только для браузера, но и для черно-белого принтера. Новый класс для этого будет содержать немного другой алгоритм форматирования и совсем другой способ вывода данных, при этом часть когда, обрабатывающая данные, всё равно останется той же. Реализовать это можно так:
1. Общий алгоритм работы с данными выносим в абстрактный класс `DataPresenter`, например в метод `provideBasicFormatting()`. Там реализовываем общее форматирование для браузера и для принтера.
2. Для браузера создаём класс `DataPresenterForBrowser`, для принтера - `DataPresenterForMonochromePrinter`. Оба этих класса унаследованы от `DataPresenter()` и вызывают его метод `provideBasicFormatting()`, а затем уже добавляют особое форматирование для браузера/принтера.
3. Теперь нам нужно реализовать вывод данных. Можно оставить выбор имени метода, делающего это, на волю разработчикам, а можно обязать их реализовать метод `render()`. Для этого, в класса `DataPresenter` создаём абстрактый метод `render()`. Теперь, разработчики классов `DataPresenterForBrowser` и `DataPresenterForMonochromePrinter` обязаны реализовать метод `render()` под нужное устройство - а иначе просто не скомпилируется программа.
Просьба всем, кто только начинает разбираться в ООП, написать, было ли понятным моё объяснение.
Глеб
16 уровень
PS забудем про дефолтные интерфейсы. Они зло. Их не существует. Они непонятные