Расширение возможностей класса. Как организовать?

akxxiv

Новичок
Расширение возможностей класса. Как организовать?

Ситуация такая. Есть класс, который работает с древовидной структурой типа id | parent_id | priority.
Сий класс реализует какое-то подобие DOM. Т.е. методы getParent, getChild, getFirstChild ...
Например, надо узнать имя родительского узла.
PHP:
$node = new Data_Structure ("table_name");  // table_name - имя таблицы в которой усе хранится
$node->init($id);  // Определяем текущий узел
$parent_name = $node->getParent()->get("name");
Собственно где-то так. Т.е. в методе getParent() происходит следующие:
PHP:
public function getParent()
{
      $parent = $this->get("parent_id");
      if(!$parent) return false;
      $node = new Data_Structore($this->table);
      $node->init($parent);
      return $node;
}
А если я хочу расширить возможности класса, например использовать его для структуры сайта, где есть уникальное поле "uri"
Соответсвенно добавится метод initByUri(), а в методах addAfter() , moveAfter() addIn() и moveIn(), теперь должна быть проверка на уникальность данного uri.
Наверное правильно было бы наследовать новый класс от класса структуры, и переопределить в нем эти методы. Но тогда возникает вопрос, если я создаю экземпляр класса, назовем его Data_SiteStructure, который наследует Data_Struucture.
PHP:
$node = new Data_SiteStructure("table_name");
$node->initByUri("/about/news/");
$node->getParent()->moveAfter($id);
Т.е. здесь мы определяем родителя и говорим ему что он перемещен за узел с id = $id; Но при этом создается экземпляр Data_Structore, который не имеет некторых методов из Data_SiteStructure.

Вопрос каким образом это решается? Вижу пока два варианта.
1. Определять в методе getParent() и иже с ним, класс который унаследовал Data_Structure и создавать его экземпляр, но как это сделать я не знаю.
2. Сделать Data_Structure абстрактным, все спорные методы тоже абстрактными и переопределять их во всех производных классах. Но это вроде как геморно. или нет?
 

StUV

Rotaredom
если в дереве все ноды будут одного типа сделай в родительском классе метод вида
PHP:
protected function getClass()
{
    return get_class($this);
}
и в методе getParent() что-то вроде:

PHP:
$classname = $this->getClass();
$node = new $classname();
(можно и через Reflection)
 

akxxiv

Новичок
Еще один вопросик.

Еще один вопросик.

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

static $TREE;

Тогда все замечательно, все узлы (экземпляры класса) будут работать с этой переменной. Но если теперь экземпляр класса будет создан для работы с другой таблицей. Что тогда?
Например
PHP:
// Для работы со структурой сайта создаем экземпляр

$site = new Data_Structure("site_structure");
$site->getTree();

// Для работы со структурой каталога

$catalog = new Data_Structure("catalog_structure");
$catalog->getTree()
Так вот если я не ошибаюсь то оба экземпляра будут работать с одной статической переменной. Хотя таблицы разные.
Я тут вижу только один способ - это, как раньше упомянал, делать наследника от Data_Structure и вот в нем и определять статическую переменную static $TREE, но правильно ли это, получается что в самом Data_Structure есть функции которые работают с $TREE, но она не определена еще????
 

exxbrain

Новичок
akxxiv

строка таблицы с news имеет ссылку parent_id на строку с about?
Расширить класс можно переопределив конструктор и добавив метод initByUri

-~{}~ 22.06.07 18:52:

из экономических соображений делают предварительную загрузку всего дерева
из экономических все содержимое таблицы - прикольный класс

-~{}~ 22.06.07 19:01:

все узлы (экземпляры класса) будут работать с этой переменной
зачем узлам знать о существовании всего дерева?

В крайнем случае можно брать эту инфу извне (из другого класса - хранителя деревьев ) ). Но странно это.
 
Сверху