liskov替换原理与界面隔离原理的区别

Nil*_*aha 13 liskov-substitution-principle interface solid-principles interface-segregation-principle

Liskov 替换原则 (LSP) 和接口隔离原则 (ISP) 之间有什么核心区别吗?最终,两者都保证设计具有通用功能的界面,并在您具有特殊功能时引入新界面。

Jon*_*eid 19

LSP:接收方必须履行其承诺的合同。

ISP:调用者不应该依赖比它需要的更多的接收者接口。

它们适合的地方:如果您使用 ISP,您只会使用接收器完整接口的一部分。但根据 LSP,接收方仍必须遵守该切片。

如果你没有申请 ISP,就会有违反 LSP 的诱惑。因为“这个方法没有关系,它实际上不会被调用”。

  • 可以将其恢复为:*里氏替换*解决**子类型**设计,而*接口隔离*解决**基类型**设计。 (2认同)

Abu*_*eid 8

它们都是 SOLID 原则

  • LSP(Liskov Substitution):该原则要求您确保所有子类都具有与父类相同的行为。例如:如果您有一个Device类并且它具有callBaba()获取您父亲电话号码然后呼叫他的功能,那么您必须确保该类的callBaba()所有子类中的方法Device执行相同的工作。如果 的任何子类 Device内部有其他行为,callBaba()则意味着您破坏了 LSP

违反 Liskov 原则的代码示例。

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 ")
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案

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")
            }
        }
Run Code Online (Sandbox Code Playgroud)
  • ISP(接口隔离):要求你为不同的职责创建不同的接口,换句话说,不要将不相关的行为归为一个接口,如果你已经有一个有很多职责的接口,那么你就破坏了 ISP,而实现者没有需要所有这些东西

这违反了 ISP 原则,因为它有两个不同的职责

  protocol Animal {
        func fly()
        func eat()
    }
Run Code Online (Sandbox Code Playgroud)

解决方案

protocol Flyable {
    func fly()
}
protocol Feedable {
    func eat()
}
Run Code Online (Sandbox Code Playgroud)

  • @乔纳森对我来说似乎也一样:D (2认同)

jac*_*646 7

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

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

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

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

另请参阅:LSP 与 DIP