OOP - 空白界面

时间:2014-10-26 14:32:03

标签: php oop interface

我们说我有这两个接口(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是一个类,它将所有渲染器类保存为单例和决定,哪个渲染器可用于哪个块。

0 个答案:

没有答案