是否将类队列扩展为类堆栈中断Liskov原理?

问题描述 投票:0回答:1

如果我有课程Queue

class Queue {
  pop () {
   return 'Last value of Array'
  }
}

...和类Stack

class Stack extends Queue {
  @Override
  pop () {
   return 'First value of Array'
  }
}

是否违反了Liskov替代原则?为什么?

design-patterns stack queue solid-principles liskov-substitution-principle
1个回答
0
投票

是,这违反了LSP,因为Stack违反了Queue的合同。我怀疑示例中的注释是相反的:Queue应该是FIFO,而Stack应该是LIFO;但是,无论哪种方式,子代和父代各自的pop()方法都具有相反的后置条件,因此一个不能从另一个继承。

  • pop()Queue的后置条件是已删除最旧的元素。
  • pop()中的Stack的后置条件是已删除最新元素。

显然,这两个条件不能通过相同的方法来满足。

[以Java为例,Queue没有Queue方法,并且没有由pop()实现。StackStack实现,Queue结合了DequeDeque方法,但请注意,如何详尽记录Queue以定义不同方法集的不同行为。

© www.soinside.com 2019 - 2024. All rights reserved.