Liskov替代原则是否也适用于实现接口的类?


17

LSP声明,类应可替代其基类,这意味着派生类和基类在语义上应等效。

但是LSP是否也适用于实现接口的类?换句话说,如果由类实现的接口方法在语义上与用户期望的不同,是否将其视为违反LSP?


7
是。完全相同的原因和结果与违反LSP(如果它是接口,抽象类,完整类)无关紧要。LSP旨在设定并满足期望,以使消费者能够以一般方式对待您的类型。
吉米·霍法

5
总的来说(我知道它们之间的区别,但是我在这里进行了概括),接口在某种程度上类似于纯抽象类(C ++术语),因此Liskov应该适用于接口和实现它们的类。
Jesse C. Slicer 2012年

3
注意,我熟悉的LSP的提法是讲子类型,而不是派生类和基类。我想有充分的理由,因为没有任何原因是继承所特有的,并且也适用于任何其他类型的子类型。

Answers:


17

如果由类实现的接口方法在语义上与用户期望的不同,是否将其视为违反LSP?

如果实现在语义上与通过接口的不变式及其方法的前后条件所记录的行为不同,则答案为“是”,则将违反LSP。该原理建立了抽象及其实现的规则,而无需以类的形式呈现抽象方面。

但是,如果我们谈论用户的期望,答案将是“不一定”:用户有权享有错误的期望。


“如果实现在语义上与通过接口的不变式记录的行为不同”,您能否详细说明“接口的不变式”的含义?
user1483278

3
@ user1483278这是有关类型不变量的文章。本文称它们为“类不变式”,但该描述也适用于接口。不变性是在构造时建立的条件,并在实例的整个生命周期内保持不变。例如,如果一个接口有一个属性Name不能被设置为null,然后obj.Name != null被说成是一个不变的该接口的。
dasblinkenlight 2012年

1
通常,在讨论不变量时,可以编写一段代码来验证该不变量在对象的整个生命周期中得到保持。但是,通常用简单的英语口头描述不变量。
rwong 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.