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