首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >liskov代换原理与界面分离原理的区别

liskov代换原理与界面分离原理的区别
EN

Stack Overflow用户
提问于 2019-02-01 13:39:51
回答 3查看 7.8K关注 0票数 26

Liskov替代原理(LSP)和接口隔离原理(ISP)之间有什么核心区别吗?最终,这两种功能都将用于设计具有通用功能的接口,并在有特殊功能的情况下引入新的接口。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-03 05:33:28

LSP:子类型必须遵守它所承诺的合同。

ISP:调用者不应该比它所需要的更多地依赖于基本类型的接口。

合适的地方:如果您应用ISP,则只使用接收器的完整接口的一部分。但根据LSP的说法,接收方仍然必须遵守这一规定。

如果你不能应用ISP,可能会有违反LSP的诱惑。因为“这个方法不重要,它实际上不会被调用。”

票数 23
EN

Stack Overflow用户

发布于 2019-07-20 16:52:05

两者都是坚实的原则。

  • LSP (Liskov替换):这个原则要求您确保所有子类都具有与父类相同的行为。例如:如果您有一个Device类,并且它有函数callBaba(),然后调用父亲的电话号码,那么您必须确保Device的所有子类中的callBaba()方法都执行相同的工作。如果Device的任何子类在callBaba()中有另一个行为,这意味着您破坏了LSP

违背Liskov原则的代码示例。

代码语言:javascript
复制
class Device {
    func callBaba() {
        print("I will find your father and I will call him")
    }
}

class Calculator: Device {
    override func callBaba() {
      print("Sorry, I don't have this functionality ")
    }
}

解决方案

代码语言:javascript
复制
interface CanCall {
            func callBaba()
        }
        class Device {
            // all basic shared functions here.
        }

        class Calculator: Device {
            // all functions that calculator can do + Device
        }
        class SmartPhone: Device implements CanCall {
            // all smartphone stuff
            func callBaba() {
                print("I will find your father and I will call him")
            }
        }
  • ISP (接口隔离):要求您为不同的职责创建不同的接口,换句话说,不要将不相关的行为分组在一个接口中,如果您已经有了一个具有多个责任的接口,并且实现者不需要所有这些内容,就会破坏ISP。

这违反了ISP的原则,因为它有两种不同的责任。

代码语言:javascript
复制
  protocol Animal {
        func fly()
        func eat()
    }

解决方案

代码语言:javascript
复制
protocol Flyable {
    func fly()
}
protocol Feedable {
    func eat()
}
票数 15
EN

Stack Overflow用户

发布于 2020-12-29 23:02:10

LSP规范父类和子类之间的关系(即层次关系)。它将告诉您如何实现API。

ISP管理父类和客户类之间的关系(即生产者/消费者关系)。它告诉您何时实现API。

考虑一个具有100个方法的接口。一个子类可以在不违反其中任何一个类定义的契约的情况下实现所有的100个,从而满足Liskov替换;但是很难想象每个客户端都需要所有这些方法,因此接口隔离几乎肯定会被违反。

相反,只有一个方法的接口肯定满足接口隔离;但是如果实现不遵守该方法契约,那么Liskov替换就会被违反。

另见:LSP vs DIP

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54480725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档