我有这段代码
class Duck { protected $strVocabulary; public function Learn() { $this->strVocabulary = 'quack'; } public function Quack() { echo $this->strVocabulary; } }
代码在PHP中,但问题不依赖于PHP。 在它知道Quack之前,鸭子必须学习。
我的问题是:如何在Quack()
被调用后才能使Learn()
可以调用?
答案 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中的第一行,随意纠正