Я недавно внедряю систему шаблонов для своей домашней платформы генератора веб-сайтов. То, что я в настоящее время пытается реализовать, является использование интерфейса по всей иерархии классов шаблона, как так (это просто пример):пытается вызвать функцию интерфейса во всей абстрактной иерархии экземпляра объекта
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() в каждом из них без автоматического разрешения одной переопределенной версии в классе представления.
Другой вариант, который я рассматривал, заключался в использовании статических функций, но который не может быть применен с интерфейсом, я мог бы определить его в самом базовом классе, но опять же, в этом случае нет ничего, что конкретно обозначает класс как самозваный (так сказать).
Это действительно необходимо ввести в действие по типу, поэтому я решил использовать шаблон интерфейса на нем.
Любые комментарии или предложения были бы наиболее ценными.