如果我有课程Queue
Queue
class Queue { pop () { return 'Last value of Array' } }
...和类Stack
Stack
class Stack extends Queue { @Override pop () { return 'First value of Array' } }
是否违反了Liskov替代原则?为什么?
是,这违反了LSP,因为Stack违反了Queue的合同。我怀疑示例中的注释是相反的:Queue应该是FIFO,而Stack应该是LIFO;但是,无论哪种方式,子代和父代各自的pop()方法都具有相反的后置条件,因此一个不能从另一个继承。
pop()
显然,这两个条件不能通过相同的方法来满足。
[以Java为例,Queue没有Queue方法,并且没有由pop()实现。Stack由Stack实现,Queue结合了Deque和Deque方法,但请注意,如何详尽记录Queue以定义不同方法集的不同行为。
Deque