【发布时间】:2016-08-03 07:35:40
【问题描述】:
目前的设计是
-
SharedFolder是Folder的子类。 -
SharedFile是具有远程资源 URL 的File的子类。 -
Folder在add方法中接受File。 -
SharedFolder仅接受SharedFile但不接受非共享File -
File可以通过add移动到另一个Folder。 -
SharedFolder和Folder中浏览文件的 UI 基本相同。
SharedFile 中的 add 违反了 LSP。如何在允许某些 UI 代码重用的同时重新组织对象结构?
【问题讨论】:
-
您可以定义 add 方法以不通过合同保证在所有情况下都可以添加。这样就不会出现替换失败。
-
@usr,你是说文档本身就可以满足LSP?在这种情况下,即使是臭名昭著的 Iterator.remove() 方法也满足 LSP。
-
静态输入只是一种以机器可读的方式添加一些文档的方法。接口契约是任意的。它是你定义的任何东西。不要纠结于语法或语言问题。
-
作为一个具体的解决方案,您可以添加此方法:
bool TryAdd(File f)并允许文件夹以任何原因拒绝项目。这样你就可以通过告诉用户“这个文件不能放在这里”来在 UI 中显示它。投掷也可以。异常只是返回某些东西的另一种方式。 -
我同意@usr,并不是所有的规则和不变量都必须通过类型检查来强制执行。我会在这里抛出一个异常或返回
AddResult而不是bool这不会真正让客户知道出了什么问题。
标签: oop inheritance solid-principles liskov-substitution-principle