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