是否可以将有界堆栈数据结构(具有上限的堆栈)实现为传统堆栈的子类型而不违反Liskov替换属性?
可以使用传统的堆栈代替有界堆栈,但是如果有足够大的限制,则可以仅使用有界堆栈代替传统堆栈。我对这个想法是否正确?
liskov属性是反向的吗?
感谢。
答案 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或更大的有界堆栈将完全替代“常规”堆栈。如果它没有任何特定的容量承诺,任何容量的有界堆栈都是可替代的。