Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 对象内部的依赖关系_Oop_Design Patterns - Fatal编程技术网

Oop 对象内部的依赖关系

Oop 对象内部的依赖关系,oop,design-patterns,Oop,Design Patterns,我有这个密码 class Duck { protected $strVocabulary; public function Learn() { $this->strVocabulary = 'quack'; } public function Quack() { echo $this->strVocabulary; } } 班鸭{ 受保护的可撤销美元; 公共职能学习(){ $this->strVocabulary='quack'; } 公共职能庸医{ echo$

我有这个密码

class Duck { protected $strVocabulary; public function Learn() { $this->strVocabulary = 'quack'; } public function Quack() { echo $this->strVocabulary; } } 班鸭{ 受保护的可撤销美元; 公共职能学习(){ $this->strVocabulary='quack'; } 公共职能庸医{ echo$this->strVocabulary; } } 代码是用PHP编写的,但问题不依赖于PHP。 鸭子在知道嘎嘎叫之前必须先学会


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

不,这不违反任何OOP原则

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

在Java中,甚至还有一个在编译时执行此类检查(无论
Duck
是否已经
Quack()
)的。我经常将此类依赖项作为接口的前提条件,并使用一个转发类,其唯一目的是对其转发到的对象的状态进行protocolling和检查,即对该对象调用了哪些函数的协议,并在不满足前提条件时抛出异常(例如InvalidStateException)


处理这个问题的设计模式是:当对象的内部状态发生变化时,它允许对象改变其行为。对象将显示为更改其类。还使用了上面的示例,即网络连接正在建立或未建立。

如果要修复顺序,则可以使用抽象基类,其中在函数quack()中首先调用learn(),然后调用抽象方法doquack()(其他一些好名称,这必须由每个派生类实现)

我的问题是:如何使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中的第一行,请随意更正

我不确定我是否理解这个问题。如果你是这么想的话,这两个函数并不相互依赖。它们都修改了
$strvaculary
,但它们并不相互依赖。@Jonathan从功能的角度看,它们是分开工作的,但从逻辑的角度看,首先必须调用learn,然后再调用quack才能得到一些有效的结果。你的问题也是,“我如何使quack只有在调用learn之后才可以调用?”或者你只是说这是你的结构,你将在你的代码中管理方法调用的顺序?@Jonathan-yes(“我如何使江湖医生只有在调用Learn之后才可以调用”)。我也在考虑设计模式,如果这个案例与其中一个模式有任何关联,如果对象可以独立控制其状态,这是一个很好的解决方案。如果一个客户或环境控制着这个州,那就不行了。我同意。如果是那样的话,我会支持州政府。