код прилагаю ниже в тексте, т.к. решенную задачу уже не пикрепить. слегка обкарнаю - удалю класс с Агатой Кристи, чтоб места меньше занимать.
Итак вопрос. классы MarkTwainBook и AgathaChristieBook публичные, поэтому в getOutputByBookType в проверке instanceof я просто записал this, понимая, что этот метод будет применяться из самого дочернего класса, и он достался в наследство от класса Book. А в предлагаемом правильном решении в instanceof вместо this(как у меня) используется getBook(). так как правильнее? и для чего это вообще сделано? какая практическая польза от этого? и в какой момент программа решает распечатать наш output? в методе main есть system.out.println(books), то есть распечатка всего листа books. как и почему тут срабатывает toString, который и вызывает getOutputByBookType? это потому что наш toString переопределяет такой же метод у System.our.println ?
public class Solution {
public static void main(String[] args) {
List<Book> books = new LinkedList<Book>();
books.add(new MarkTwainBook("Tom Sawyer"));
books.add(new AgathaChristieBook("Hercule Poirot"));
System.out.println(books);
}
abstract static class Book {
private String author;
public Book(String author) {
this.author = author;
}
public abstract Book getBook();
public abstract String getTitle();
private String getOutputByBookType() {
String agathaChristieOutput = author + ": " + getBook().getTitle() + " is a detective";
String markTwainOutput = getBook().getTitle() + " was written by " + author;
String output = "output";
//Add your code here
if(this instanceof MarkTwainBook)
output = markTwainOutput ;
else if(this instanceof AgathaChristieBook)
output = agathaChristieOutput;
return output;
}
public String toString() {
return getOutputByBookType();
}
}
public static class MarkTwainBook extends Book{
private String author;
private String title ;
public MarkTwainBook(String title) {
super("Mark Twain") ;
this.title = title ;
}
@Override
public MarkTwainBook getBook(){
return this;
}
@Override
public String getTitle(){
return this.title ;
}
}
Eugene Volkov
39 уровень
задача решена и прошла валидатор, но так как не до конца разобрался, подсмотрел в ответ и не понял...
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
safelogj Android Developer
19 октября 2025, 22:07
с каждой задачей у вас всё больше вопросов по теории, я когда проходил курс, абсолютно все лекции основные и доп. читал дважды в разное время, некоторые темы по 4 раза.
например ваш вопрос :
разбирается в Syntax 18 лвл, там где про инкапсуляцию. вы его уже должны были читать
https://javarush.com/quests/lectures/questsyntaxpro.level17.lecture00
про System.our.println() помню что вроде у него тьма перегруженых методов, и некоторые из них автоматом вызывают toString() у переданного в них объекта
Не спешите проходить курс, не гонитесь за ачивками, читайте всё что не понятно в лекциях снова, пока не поймёте. И кстати самое полезное тут в доп. лекциях по теории, а не в основных.
0
Eugene Volkov
19 октября 2025, 22:23
конечно вопросы) потому что появляется понимание, а не наоборот) вспомните школу или универ - чем больше знаешь, тем больше понимаешь, что многого не знаешь, и тогда начинаешь задавать вопросы.) а если учитель спрашивал "есть вопросы?" и все молчали, то, вероятно, многие не поняли) а насчет чтения статей - читаю, перечитываю. Когда их дают снова, перечитываю снова, вдруг что упустил. И действительно, чем дальше продвигаюсь, тем больше узнаю из того, что казалось бы уже прочел.
И насчет инкапсуляции я понял, иначе зачем вообще геттеры(к которым и относится наш getBook) и сеттеры.
вопрос, зачнм в данном конкретном примере getBook, если getOutputByBookType вызывается внутри нашего дочернего класса, ведь этот метод перешел в наследство. это ведь как раз инкапсуляцию не напушает
0
safelogj Android Developer
19 октября 2025, 22:34
потому что так принято и это может пригодится на будушее чтоб внутри геттера что нибудь проверять.
и кстати в задачах правильное решение это не всегда эталон
0
Eugene Volkov
19 октября 2025, 22:36
понял, сенькью
0