2011-06-01 57 views
2

可以將有界的堆棧數據結構(具有上限的堆棧)作爲常規堆棧的子類型實現而不違反Liskov置換屬性嗎?堆棧,有界堆棧和Liskov替換屬性

傳統的堆棧可以用來代替有界的堆棧,但是一個有界的堆棧只能用來代替傳統的堆棧,如果它有足夠大的限制。我是否糾正這個想法?

liskov屬性是否正確?

謝謝。

回答

1

里氏substituion princple表述爲

設q(x)爲可證明的關於對象的屬性類型T.則Q(Y)的X應爲S型的對象ý真其中S是一個子類型的T.

讓我們說T是類型Stack並且S是BoundedStack類型的T的子類型。

現在,讓我們將q(x)定義爲堆棧x的容量。

如果x是T的一個實例,那麼容量是無限的/無限的。 如果x是S的一個實例,那麼當容量現在有界時,這不成立。

因此,該原則不成立。

+0

太棒了,這一切都有道理。謝謝。 – Lee 2011-06-01 10:48:15

+0

@monkjack:容量是無限的,還是僅僅是不明確的?如果容量不確定,那麼爲什麼沒有定義容量和定義的溢出行爲的類不能替代實際容量和溢出行爲都沒有被指定的類? – supercat 2011-09-12 21:58:53

0

明顯有界的堆棧會爲push方法產生一種新的異常。所以它不符合LSP。

0

如果確實存在無限堆棧這樣的事物,則有界堆棧不會是它的子類型。另一方面,「常規」堆棧的語義可能更像是「如果推送的對象數量不超過某些模糊的,不可知的和任意可變的限制,則推送該對象;否則在某些任意的和未定義的時尚。」如果一個普通的堆棧提供了一個Count屬性並且承諾其Count爲1,000或更小的任何堆棧都能夠接受另一個項目,那麼容量爲1,000或更大的有界堆棧將完全可以替代「常規」堆棧。如果它沒有對容量做出任何特別的承諾,那麼一個具有任何容量的有界棧將是可替代的。