堆栈,有界堆栈和Liskov替换属性

时间:2011-06-01 10:35:11

标签: stack liskov-substitution-principle

是否可以将有界堆栈数据结构(具有上限的堆栈)实现为传统堆栈的子类型而不违反Liskov替换属性?

可以使用传统的堆栈代替有界堆栈,但是如果有足够大的限制,则可以仅使用有界堆栈代替传统堆栈。我对这个想法是否正确?

liskov属性是反向的吗?

感谢。

3 个答案:

答案 0 :(得分:1)

Liskov代替原则表示为

设q(x)是可证明类型为T的对象x的属性。对于S类型的对象y,q(y)应该为真,其中S是T的子类型。

让我们说T是Stack类型,S是BoundedStack类型的T的子类型。

现在,让我们将q(x)定义为堆栈x的容量。

如果x是T的实例,那么容量是无限/无限的。 如果x是S的一个实例,那么这不会成立,因为现在容量有限。

因此原则不成立。

答案 1 :(得分:0)

显然有限堆栈会为push方法生成一种新类型的异常。所以它不符合LSP。

答案 2 :(得分:0)

如果确实存在无限堆栈这样的事情,那么有界堆栈就不会是它的子类型。另一方面,“常规”堆栈的语义可能更像是“如果推送的对象数量不超过某些模糊,不可知和任意变量的限制,则推送对象;否则会失败一些任意和未定义时尚。”如果常规堆栈提供Count属性并且承诺Count为1,000或更小的任何堆栈将能够接受另一个项目,则容量为1,000或更大的有界堆栈将完全替代“常规”堆栈。如果它没有任何特定的容量承诺,任何容量的有界堆栈都是可替代的。