我有这个代码
class Duck { protected $strVocabulary; public function Learn() { $this->strVocabulary = 'quack'; } public function Quack() { echo $this->strVocabulary; } }
不,这不违反任何OOP原则.
一个突出的例子是一个对象,其行为取决于是否建立了连接(例如,函数doNetworkStuff()取决于openConnection()).
在Java中,甚至有一个typestate checker,它在编译时执行这样的检查(Duck是否已经是Quack()).我经常有这样的依赖作为接口的前提条件,并使用转发类,其唯一目的是协议并检查它转发到的对象的状态,即协议在对象上调用了哪些函数,并抛出异常(例如InvalidStateException)不符合先决条件.
处理此问题的设计模式是state:它允许对象在其内部状态更改时更改其行为.该对象似乎会更改其类. design pattern book from the Gang of Four还使用上面建立或未建立的网络连接示例.