对象内的依赖关系

时间:2011-09-14 20:05:38

标签: oop design-patterns

我有这段代码

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

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

代码在PHP中,但问题不依赖于PHP。 在它知道Quack之前,鸭子必须学习。

我的问题是:如何在Quack()被调用后才能使Learn()可以调用?

3 个答案:

答案 0 :(得分:3)

不,这不违反任何OOP原则。

一个突出的例子是一个对象,其行为取决于是否建立了连接(例如,函数doNetworkStuff()取决于openConnection())。

在Java中,甚至有typestate checker,它在编译时执行此类检查(Duck是否已经Quack())。我经常有这样的依赖关系作为接口的前提条件,并使用转发类,其唯一目的是协议并检查它转发到的对象的状态,即协议在对象上调用了哪些函数,并抛出异常(例如InvalidStateException)没有达到先决条件。

处理此问题的设计模式是state:它允许对象在其内部状态发生变化时改变其行为。该对象似乎会更改其类。 design pattern book from the Gang of Four也使用上面建立或未建立的网络连接示例。

答案 1 :(得分:1)

如果你想修改顺序,那么你可以使用一个抽象基类,在函数quack()中你首先调用learn()然后抽象方法doquack()(其他一些好名字,这必须是由每个派生类实现)。

答案 2 :(得分:0)

  

我的问题是:如何在Learn()之后才能调用Quack()   被称为?

你可以分开关注:

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中的第一行,随意纠正