liskov替换原理和界面隔离原理之间的区别

时间:2019-02-01 13:39:51

标签: interface solid-principles liskov-substitution-principle

Liskov替代原理(LSP)和接口隔离原理(ISP)之间是否有核心区别?最终,两者都保证设计具有通用功能的接口,并在您有特殊用途的功能时引入新的接口。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

另见:LSP vs DIP

答案 1 :(得分:1)

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

ISP:呼叫者不应依赖过多的接收者。

它们适合的位置:如果应用ISP,则仅使用接收器完整接口的一部分。但是根据LSP,接收者仍然必须遵守该分片。

如果您无法应用ISP,则可能会有违反LSP的诱惑。因为“此方法无关紧要,所以实际上不会调用它。”

答案 2 :(得分:0)

LSP(利斯科夫换人): 问题:您的孩子中有一个覆盖的未使用/空方法,换句话说,您的孩子扩展了行为,并且不需要它: 例如:

/// LSP vs ISP

class Animal {
    func fly() {
        // TODO: flying logic
    }

    func eat() {
        // TODO: eating logic
    }
}

class Cat: Animal {
    override func fly() {
        //Hi I'm a cat I cant fly,
        ///here is the Breaking of LSP, I have a different behavior
    }
}

ISP(接口隔离):您已经有一个承担许多职责的接口,并且实现者不需要所有这些东西,因此您需要打破这些方法并将它们重新组合为关系行为

//this is bad, why, cause it have two different responsibilities
protocol Animal {
    func fly()
    func eat()
}
//to it write
protocol Flyable {
    func fly()
}
protocol Feedable {
    func eat()
}