Нарушение принципа подстановки Лискова в SharedFolder
Текущий дизайн
SharedFolder
это подклассFolder
,SharedFile
это подклассFile
с URL удаленного ресурса.Folder
принимаетFile
вadd
метод.SharedFolder
принимает толькоSharedFile
но не общийFile
File
может быть перемещен в другойFolder
сadd
,- Пользовательский интерфейс для просмотра файлов в
SharedFolder
а такжеFolder
в основном то же самое.
add
в SharedFile
нарушать ЛСП. Как реорганизовать структуру объекта, допуская повторное использование кода пользовательского интерфейса?
2 ответа
Решение
Вы можете обобщать Folder
как Folder<T extends File>
, с add(T)
, и имеют SharedFolder extends Folder<SharedFile>
,
Сюда, SharedFolder
ожидается только заменить другой Folder<SharedFile>
, но не любой другой тип Folder<File>
(Если ваш язык позволяет это. Это было бы возможно в Java)
Есть много возможных ответов на ваш вопрос. Вот два:
- Удалить
add
метод изFolder
базовый класс, и только позвольте ему выставить (только для чтения) коллекциюFile
элементы. - Удалить отношения "есть" между
SharedFolder
а такжеFolder
, Другими словами, не позволяйтеSharedFolder
наследовать отFolder
, Вместо этого вы могли бы позволитьSharedFolder
стать своего рода классом метаданных, который содержитFolder
(композиция по наследству).