我们说我有这两个接口(PHP语法)
interface Renderable_Item
{
}
interface Item_Renderer
{
function render(Renderable_Item $item);
}
我有一组类似于同一类的类,但它们没有任何重要的共同点(在 Item_Renderer 的观点中)。所有这些类都实现了 Renderable_Item ,因为它们都应该可以通过 Item_Renderer 进行渲染。所以 Renderable_Item 界面只是我对这些类进行分组的方法。
实现 Item_Renderer 的类必须首先检测具体类型," downcast"它然后调用具体类的方法,所以界面在这里没有意义,但在我看来,它只适合#34;有
有更好的方法吗?
顺便说一句,我正在用PHP编写的PHP解析器。 (我知道在PERL中有一些PHP解析器,但只是为了好玩..;))首先,我将PHP代码分解为结构化块(实现空白接口的类" Code_Chunk"(= Renderable_Item,在我的示例中))。这是例如表示Assignment表达式的类如何 -
class Assignment implements Expression
{
/**
* @var Variable
*/
private $variable;
/**
* @var Expression
*/
private $variableValue;
/**
* @return Expression
*/
public function getVariableValue()
{
return $this->variableValue;
}
/**
* @param Expression $variableValue
*/
public function setVariableValue($variableValue)
{
$this->variableValue = $variableValue;
}
/**
* @param Variable $variable
*/
public function setVariable(Variable $variable)
{
$this->variable = $variable;
}
/**
* @return Variable
*/
public function getVariable()
{
return $this->variable;
}
}
接口表达式只是另一个扩展Code_Chunk的空白接口,只是为了区分具有某些值(=表达式)的代码块。
然而,我可以使用这些类之间没有什么共同之处,除非它们都是某种类型的代码块"。
在这个过程之后,我想要重新渲染整个解析的代码树,这基本上是大量实现Code_Chunk的自定义类的结构化实例。每个Code_Chunk都有自己的渲染类(实现Chunk_Renderer(= Item_Renderer)),只接受一个特定的块。例如,这是Assignment rendering class
class Assignment_Renderer implements Chunk_Renderer
{
public function render(Code_Chunk $chunk)
{
if(!($chunk instanceof Assignment)){
throw new Unexpected_Chunk_Exception($chunk);
}
/**
* @var $chunk Assignment
*/
$_ = '';
$_ .= $chunk->getVariable()->toString();
$_ .= '=';
$_ .= Chunk_Renderer_Factory::render($chunk->getVariableValue());
return $_;
}
}
Chunk_Renderer_Factory是一个类,它将所有渲染器类保存为单例和决定,哪个渲染器可用于哪个块。