Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Можно ли тут наследовать?
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Можно ли тут наследовать?

Страниц (1): [1]
 

1. Vaganec Trosti - 12 Февраля, 2017 - 08:11:23 - перейти к сообщению
Привет.

Есть например понятия предметной области Нож и Складной Нож.
Как вы думаете нужно спроектировать классы в этом случае?
PHP:
скопировать код в буфер обмена
  1. class Knife{
  2.   public function cut {/* режем */}
  3. }
  4. class PocketKnife extends Knife{
  5.   private $opened = 0; // 0/1
  6.   // ...
  7.   public function cut {
  8.     if ($this->opened) {
  9.       parent::cut();
  10.     }
  11.   }
  12. }


Нарушит ли это Принцип подстановки Барбары Лисков, или я неверно его понимаю ?
Ведь для объекта Knife постусловия после операции cut() например такие:
- лезвие стало менее острым чем было (изменение атрибута самого объекта)
- разрезаемый объект получил урон.

Но если подменять Knife на PocketKnife, и второй не раскрыт, то он этих постусловий не даст, сузит получается, а в принципе сказано - "Постусловия не могут быть ослаблены в подклассе"
2. Sail - 13 Февраля, 2017 - 09:28:44 - перейти к сообщению
Vaganec Trosti, Вы же не ограничиваете метод cut().
Вы устанавливаете условие на возможность применения этого метода.
Если метод не применён, то и постусловия его применения остаются за рамками.
3. Vaganec Trosti - 13 Февраля, 2017 - 13:54:04 - перейти к сообщению
Клиентский то код метод вызывает. Соотв. и ожидает наверное от него чего то, что указано в базовом классе..

 

Powered by ExBB FM 1.0 RC1