SharedFolder中违反里氏替换原则

Violation of Liskov Substitution Principle in SharedFolder

目前的设计是

  1. SharedFolderFolder 的子类。
  2. SharedFileFile 的子类,具有远程资源 URL.
  3. Folderadd 方法中接受 File
  4. SharedFolder 只接受 SharedFile 但不接受非共享 File
  5. File 可以用 add.
  6. 移动到另一个 Folder
  7. SharedFolderFolder浏览文件的UI基本相同。

SharedFile中的add违反了LSP。如何在允许某些 UI 代码重用的同时重新组织对象结构?

您的问题有多种可能的答案。这里有两个:

  • Folder 基础 class 中删除 add 方法,只让它公开 File 元素的(只读)集合。
  • 删除 SharedFolderFolder 之间的 'is a' 关系。换句话说,不要让 SharedFolder 继承自 Folder。相反,您可以让 SharedFolder 成为某种元数据 class,其中包含 Folder(继承组合)。

您可以将 Folder 通用化为 Folder<T extends File>,使用 add(T),并使用 SharedFolder extends Folder<SharedFile>

这样,SharedFolder 只能替代另一个 Folder<SharedFile>,而不是任何其他类型的 Folder<File>

(如果您的语言允许。这在 Java 中是可能的)