Расширение очереди классов в стек классов нарушает принцип Лискова?

Если у меня есть класс Queue

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

... и класс Stack

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

Это нарушение принципа замены Лискова? Зачем?

1 ответ

Да, это нарушает LSP, потому что Stack нарушает договор Queue. Я подозреваю, что комментарии в примерах перевернуты:Queue должен быть FIFO, а Stackдолжен быть LIFO; но в любом случае у ребенка и родителя противоположные постусловия для их соответствующихpop() методы, поэтому одно не может наследовать от другого.

  • Постусловие pop() из Queue заключается в том, что самый старый элемент удален.
  • Постусловие pop() из Stack в том, что удален самый новый элемент.

Ясно, что эти два условия нельзя удовлетворить одним и тем же методом.

Чтобы использовать Java в качестве примера, Queue не имеет pop() метод и не реализуется Stack.
Queue будет осуществляться Deque, который сочетает в себе оба Queue а также Stack методы, но обратите внимание, как Deque исчерпывающе задокументирован для определения различного поведения для разных наборов методов.

Другие вопросы по тегам