Интересно, как я должен организовать свои два класса.
- Один из них представляет собой
Knife
: простой, прочный, простой, как кухонный нож. - Другой —
PocketKnife
, который находится в состоянии открыто или закрыто.
class Knife{
public function cut() {/* do the cutting */}
}
class PocketKnife extends Knife{
private $opened = 0; // 0/1
// ...
public function cut() {
if ($this->opened) {
parent::cut();
}
}
}
Ни один из классов в моем коде не является абстрактным.
Нарушает ли этот пример LSP?
На мой взгляд, да, потому что постусловия для операции cut()
должны быть:
- лезвие ножа немного "стареет" после разрезания
- на каком-то объекте должны быть какие-то повреждения (например, если это какая-то игра)
Но если PocketKnife
находится в закрытом состоянии, у нас не будет этих пост-условий. Или я ошибаюсь?