Расширение очереди классов в стек классов нарушает принцип Лискова?
Если у меня есть класс 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
исчерпывающе задокументирован для определения различного поведения для разных наборов методов.