SharedFolder中违反里氏替换原则
Violation of Liskov Substitution Principle in SharedFolder
目前的设计是
SharedFolder
是 Folder
的子类。
SharedFile
是 File
的子类,具有远程资源 URL.
Folder
在 add
方法中接受 File
。
SharedFolder
只接受 SharedFile
但不接受非共享 File
File
可以用 add
. 移动到另一个 Folder
SharedFolder
和Folder
浏览文件的UI基本相同。
SharedFile
中的add
违反了LSP。如何在允许某些 UI 代码重用的同时重新组织对象结构?
您的问题有多种可能的答案。这里有两个:
- 从
Folder
基础 class 中删除 add
方法,只让它公开 File
元素的(只读)集合。
- 删除
SharedFolder
和 Folder
之间的 'is a' 关系。换句话说,不要让 SharedFolder
继承自 Folder
。相反,您可以让 SharedFolder
成为某种元数据 class,其中包含 Folder
(继承组合)。
您可以将 Folder
通用化为 Folder<T extends File>
,使用 add(T)
,并使用 SharedFolder extends Folder<SharedFile>
。
这样,SharedFolder
只能替代另一个 Folder<SharedFile>
,而不是任何其他类型的 Folder<File>
(如果您的语言允许。这在 Java 中是可能的)
目前的设计是
SharedFolder
是Folder
的子类。SharedFile
是File
的子类,具有远程资源 URL.Folder
在add
方法中接受File
。SharedFolder
只接受SharedFile
但不接受非共享File
File
可以用add
. 移动到另一个 SharedFolder
和Folder
浏览文件的UI基本相同。
Folder
SharedFile
中的add
违反了LSP。如何在允许某些 UI 代码重用的同时重新组织对象结构?
您的问题有多种可能的答案。这里有两个:
- 从
Folder
基础 class 中删除add
方法,只让它公开File
元素的(只读)集合。 - 删除
SharedFolder
和Folder
之间的 'is a' 关系。换句话说,不要让SharedFolder
继承自Folder
。相反,您可以让SharedFolder
成为某种元数据 class,其中包含Folder
(继承组合)。
您可以将 Folder
通用化为 Folder<T extends File>
,使用 add(T)
,并使用 SharedFolder extends Folder<SharedFile>
。
这样,SharedFolder
只能替代另一个 Folder<SharedFile>
,而不是任何其他类型的 Folder<File>
(如果您的语言允许。这在 Java 中是可能的)