Нарушение принципа подстановки Лискова в SharedFolder

Текущий дизайн

  1. SharedFolder это подкласс Folder,
  2. SharedFile это подкласс File с URL удаленного ресурса.
  3. Folder принимает File в add метод.
  4. SharedFolder принимает только SharedFile но не общий File
  5. File может быть перемещен в другой Folder с add,
  6. Пользовательский интерфейс для просмотра файлов в 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 (композиция по наследству).
Другие вопросы по тегам