пытаясь вызвать интерфейсную функцию по всей абстрактной иерархии экземпляра объекта - PullRequest
0 голосов
/ 23 августа 2010

Недавно я внедрил систему шаблонов для моей домашней платформы для генерации веб-сайтов.В настоящее время я пытаюсь реализовать использование интерфейса во всей иерархии классов шаблонов следующим образом (это только пример):

interface IStyleSheet
{
    public function StyleSheetFragment();
}

abstract class TemplateBase
{
    public abstract function DoRender();
}

abstract class TemplateRoot extends TemplateBase implements IStyleSheet
{
    public function DoRender()
    {
        ?>
        <div id='content1'>
            <?php 
                $this->Content1();
            ?>
        </div>
        <div id='content2'>
            <?php 
                $this->Content2();
            ?>
        </div>
        <?php 
    }

    public abstract function Content1();
    public abstract function Content2();

    public function StyleSheetFragment()
    {
        ?>
            <style>
                #content1{
                    text-align: center;
                }

                #content2{
                    text-align: right;
                }
            </style>
        <?php 
    }
}

class PageView_Home extends TemplateRoot implements IStyleSheet
{
    public function Content1()
    {
        ?>
            <div id='foo'>
                <?php 
                    // some ui stuff here
                ?>
            </div>
        <?php 
    }

    public function Content2()
    {
        ?>
            <div id='bar'>
                <?php 
                    // some more ui stuff here
                ?>
            </div>
        <?php 
    }

    public function StyleSheetFragment()
    {
        ?>
        <style>
            #foo{
            /*
                styling stuff
            */
            }

            #bar{
            /*
                more styling stuff 
*/
            }
        </style>
        <?php 
    }
}

теперь класс представления в конце иерархиипри вызове рефлексии я хочу иметь возможность циклически перебирать список базовых классов 1 на 1 и вызывать интерфейсную функцию StyleSheetFragment () в каждом из них без автоматического преобразования в одну переопределенную версию в классе представления.

Другой вариант, который я рассматривал, состоял в том, чтобы использовать статические функции, но это не может быть реализовано с помощью интерфейса, я мог бы определить его в самом базовом классе, но, опять же, в этом случае нет ничего, что будет специально обозначать класскак самозванный (так сказать).

Это действительно должно быть приведено в исполнение по типу, поэтому я решил использовать шаблон интерфейса для него.

Любые комментарии или предложения будут наиболееоценили.

1 Ответ

0 голосов
/ 23 августа 2010

Оказывается, что статические функции могут на самом деле идти в интерфейсах php, поэтому я использовал это как решение.

...