Не нарушает ли расширение класса Queue до класса Stack принцип Лискова? - PullRequest
0 голосов
/ 14 февраля 2020

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

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

... и класс Stack

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

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

1 Ответ

1 голос
/ 14 февраля 2020

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

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

Очевидно, что эти два условия не могут быть удовлетворенным тем же методом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...