Всем привет! Возникли сложности с пониманием программы, сориентируйте, пожалуйста, по происходящему. Я понимаю, что программа работает так: 1) Мы наследуем наши новые классы от NamedItem, чтобы унаследовать приватные поля и неприватные методы для доступа к полям 2) Мы создаем методы, которые возвращают списки с типом каждого класса, чтобы их напечатать 3) Список каждого класса формируется во вспомогательном классе AbstractDbSelectExecutor<T extends NamedItem> таким образом: - в новосозданном объекте анонимного класса, наследующегося от абстрактного мы вызываем метод getQuery() и передаем туда недостающую строку запроса - после чего у этого же объекта мы вызываем метод execute(), чтобы заполнить поля объекта и вернуть их с помощью списка 4) В методе print() мы проходимся по списку и смотрим значение полей его объектов, чтобы вывести на экран Какие есть вопросы: 1) 1Верно ли, что классы-наследники действительно наследуют приватные поля класса NamedItem? Или они просто через методы получают доступ к полям класса-родителя? 2) У нас получается логика распределена по нескольким классам (в NamedItem шаблон будущих классов, в AbstractDbSelectExecutor шаблон получения списка, в анонимных классах передача одного из аргументов для создания списка, в Solution логика по выводу списка на экран). Если это так, то насколько это корректно? Мне кажется более логичным переопределить метод toString в классе-родителе, или хотя бы создать в нем поле под запрос и определить его значение в классах-наследниках Почему спрашиваю — долго провозилась с задачей, чтобы понять, что написано, хочу устранить пробелы, которые помешали быстро разобраться