2010-08-22 1 views
0

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

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() в каждом из них без автоматического разрешения одной переопределенной версии в классе представления.

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

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

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

ответ

0

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