Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop SharedFolder中违反Liskov替换原则_Oop_Inheritance_Solid Principles_Liskov Substitution Principle - Fatal编程技术网

Oop SharedFolder中违反Liskov替换原则

Oop SharedFolder中违反Liskov替换原则,oop,inheritance,solid-principles,liskov-substitution-principle,Oop,Inheritance,Solid Principles,Liskov Substitution Principle,目前的设计是 SharedFolder是文件夹的子类 SharedFile是具有远程资源URL的文件的子类 文件夹以添加方法接受文件 SharedFolder仅接受SharedFile但不接受非共享的文件 文件可以通过添加移动到另一个文件夹 浏览共享文件夹和文件夹中文件的UI基本相同 SharedFile中的add违反了LSP。如何重新组织对象结构,同时允许一些UI代码重用 你的问题有很多可能的答案。这里有两个: 从文件夹基类中删除add方法,只允许它公开文件元素的(只读)集合 删除Share

目前的设计是

  • SharedFolder
    文件夹的子类
  • SharedFile
    是具有远程资源URL的
    文件的子类
  • 文件夹
    添加
    方法接受
    文件
  • SharedFolder
    仅接受
    SharedFile
    但不接受非共享的
    文件
  • 文件
    可以通过
    添加
    移动到另一个
    文件夹
  • 浏览
    共享文件夹
    文件夹
    中文件的UI基本相同

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

    你的问题有很多可能的答案。这里有两个:

    • 文件夹
      基类中删除
      add
      方法,只允许它公开
      文件
      元素的(只读)集合
    • 删除
      SharedFolder
      文件夹之间的“是a”关系。换句话说,不要让
      SharedFolder
      文件夹继承。相反,您可以让
      SharedFolder
      成为某种元数据类,其中包含
      文件夹
      (组合而非继承)

    您可以将
    文件夹
    一般化为
    文件夹
    ,使用
    添加(T)
    ,并使用
    共享文件夹扩展文件夹

    通过这种方式,
    SharedFolder
    只能替代另一个
    文件夹
    ,而不能替代任何其他类型的
    文件夹


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

    您可以定义add方法,而不是以合约形式保证在所有情况下都可以进行添加。这样就不会出现替换失败。@usr,你是说文档本身就可以满足LSP吗?在这种情况下,即使是臭名昭著的方法也满足LSP。静态类型只是以机器可读的方式添加一些文档的一种方法。接口契约是任意的。这是你定义的。不要挂断语法或语言问题。作为一个具体的解决方案,您可以添加以下方法:
    booltryadd(文件f)
    ,并允许文件夹以任何理由拒绝项目。这样,您就可以通过告诉用户“这个文件不能放在这里”在UI中显示它。投掷也会起作用。异常只是返回某些内容的另一种方式。我同意@usr的观点,并不是所有的规则和不变量都必须通过类型检查来实现。我会在这里抛出一个异常,或者返回
    AddResult
    而不是
    bool
    ,这样客户端就不会知道出了什么问题。第一个答案如何满足LSP?集合是否需要是不可变的?否则,有问题的
    add()
    方法已简单地移动到集合中。@jaco0646这解决了问题,因为基类的使用者将无法调用
    add
    并插入与派生类协定不兼容的项……但假定使用者仍然可以调用
    getCollection().add()
    在与原始的
    add()
    @jaco0646相同的情况下,这将失败:啊,是的,我忘了提到集合应该从外部只读。如果使用design 2,如何重用代码?通常,合成需要抽象接口。他可能需要能够在变量中存储任何文件夹类型。然后,常规约束信息将丢失,LSP冲突将恢复。如果您使用的是任何文件夹类型,则无法在该文件夹中存储任何文件类型。你不能仅仅摆脱泛型约束。