В реальных объектно-ориентированных системах тип объекта прозрачен для клиента.Таким образом, код, который обрабатывает книги, не должен знать, какой тип книги, а только вызывать методы для книг.
Так что, если вам нужно реализовать другое поведение в книге в ответ на вызов метода, расширьте Book и переопределите некоторые из его методов.Если нет, то не надо.
По пустым телам ваших подклассов кажется, что они ведут себя так же, как и книги.Таким образом, вы просто помечаете книгу некоторыми дополнительными данными - разница между Энциклопедией и Романом не более важна для книги, чем твердый или мягкий переплет, или крупный или стандартный шрифт - клиент может использовать их по-разному, и каждая книга является большойпечатать книгу или это стандартная печатная книга, но это все атрибуты книги, а не существенные различия.
Я бы не стал использовать enum для вида книги, так как вы можете добавить больше данных- Я бы либо использовал свободную систему тегов, чтобы вы могли пометить книгу набором видов - так, чтобы у вас была книга с тегами {'children', 'ornithological', 'encyclopaedia',} - или разрешить структуру вроли - так что есть роль для «детской орнитологической энциклопедии», созданной тогда, когда она требуется, но без фиксированного перечисления.