Liskov替代原理(LSP)和接口隔离原理(ISP)之间有什么核心区别吗?最终,这两种功能都将用于设计具有通用功能的接口,并在有特殊功能的情况下引入新的接口。
发布于 2019-02-03 05:33:28
LSP:子类型必须遵守它所承诺的合同。
ISP:调用者不应该比它所需要的更多地依赖于基本类型的接口。
合适的地方:如果您应用ISP,则只使用接收器的完整接口的一部分。但根据LSP的说法,接收方仍然必须遵守这一规定。
如果你不能应用ISP,可能会有违反LSP的诱惑。因为“这个方法不重要,它实际上不会被调用。”
发布于 2019-07-20 16:52:05
两者都是坚实的原则。
Device类,并且它有函数callBaba(),然后调用父亲的电话号码,那么您必须确保Device的所有子类中的callBaba()方法都执行相同的工作。如果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 ")
}
}解决方案
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的原则,因为它有两种不同的责任。
protocol Animal {
func fly()
func eat()
}解决方案
protocol Flyable {
func fly()
}
protocol Feedable {
func eat()
}发布于 2020-12-29 23:02:10
LSP规范父类和子类之间的关系(即层次关系)。它将告诉您如何实现API。
ISP管理父类和客户类之间的关系(即生产者/消费者关系)。它告诉您何时实现API。
考虑一个具有100个方法的接口。一个子类可以在不违反其中任何一个类定义的契约的情况下实现所有的100个,从而满足Liskov替换;但是很难想象每个客户端都需要所有这些方法,因此接口隔离几乎肯定会被违反。
相反,只有一个方法的接口肯定满足接口隔离;但是如果实现不遵守该方法契约,那么Liskov替换就会被违反。
另见:LSP vs DIP
https://stackoverflow.com/questions/54480725
复制相似问题