Зависимости внутри объекта - PullRequest
7 голосов
/ 15 сентября 2011

У меня есть этот код

class Duck {
  protected $strVocabulary;
  public function Learn() {
   $this->strVocabulary = 'quack';
  }

  public function Quack() {
   echo $this->strVocabulary;
  }
}

Код написан на PHP, но вопрос не зависит от PHP. Прежде чем он узнает, что Крякнуть, утка должна научиться.

У меня вопрос: как сделать Quack() активным только после вызова Learn()?

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

Нет, это не нарушает принцип ООП.

Ярким примером является объект, поведение которого зависит от того, установлено соединение или нет (например, функция doNetworkStuff() зависит от openConnection()).

В Java даже есть проверка состояния типа , которая выполняет такие проверки (может ли Duck уже Quack()) во время компиляции.У меня часто бывают такие зависимости, как предварительные условия для интерфейсов, и я использую класс пересылки, единственной целью которого является протоколирование и проверка состояния объекта, к которому он пересылается, т. Е. Протокол, функции которого были вызваны для объекта, и генерирование исключений (например, InvalidStateException), когдапредварительные условия не выполнены.

Шаблон проектирования, который обрабатывает это состояние : позволяет объекту изменять свое поведение при изменении его внутреннего состояния.Объект появится, чтобы изменить свой класс. книга шаблонов проектирования от «Банды четырех» также использует приведенный выше пример сетевого подключения, либо устанавливается, либо нет.

1 голос
/ 15 сентября 2011

Если вы хотите исправить порядок, вы можете использовать абстрактный базовый класс, где в функции quack () вы сначала вызываете learn (), а затем абстрактный метод doquack () (другое хорошее имя, и это должно быть реализуется каждым производным классом).

0 голосов
/ 22 января 2017

Мой вопрос: как сделать Quack () активируемым только после вызова Learn ()?

Вы можете разделить проблемы:

class EnrolleeDuck {
  public function Learn() {
   return new AlumnusDuck('quack');
  }
}

class AlumnusDuck
{
  protected $strVocabulary;

  public function __construct(&strVocabulary) {
    &this->strVocabulary = &strVocabulary;
  }

  public function Quack() {
   echo $this->strVocabulary;
  }
}

Это мои первые строки в PHP, не стесняйтесь исправлять

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