Вопрос по ООП - изменить родителя родителя?

Vitiko

Новичок
Вопрос по ООП - изменить родителя родителя?

Есть классы:

EntityTreeSelect - выборка из дерева БД, абстрактный

EntityTree extends EntityTreeSelect - выборка + update, delete, абстрактный


MenuTreeSelect extends EntityTreeSelect - выборка из определенного дерева, в конструкторе передается название таблицы в бд

MenuTree extends EntityTree - выборка + update, delete,
в конструкторе опять же передается название таблицы в бд


Диаграмма

Вопрос: как сделать чтобы при создании класса MenuTree, его родительский класс наследовал MenuTreeSelect, а не EntityTreeSelect?
 
Диаграмма супер - запутала в конец.
Пришлось самому рисовать.

Ответ:
Никак. Класс-родитель задаётся жестко - и никак по другому (извращения вроде eval'а даже не рассматриванем).

Единственный выход - полностью менять архитектуру.
 

Vitiko

Новичок
Дмитрий Попов
Извиняюсь, диаграмму исправил:)

вопрос именно в том как правильно спроектировать классы чтобы можно было сделать такую вещь.
 

Tronyх

Новичок
Как вариант:

Допустим у тебя есть "главный" файл EntityTree.php
Код:
class EntityTree {
...
}
И ещё два файла EntityTree1.php и EntityTree2.php.
Код:
class EntityTree1 extends EntityTreeSelect{
...
}

class EntityTree2 extends MenuTreeSelect{
...
}
Тогда добавляем несколько строк кода в самое начало MenuTree.php, которые будут проверять не изменился ли EntityTree.php и если изменился то обновлять файлы EntityTree1.php и EntityTree2.php.

Запутаный ответ, но не запутаней вопроса.
 
Такую вещь никак не сделать. У одного класса может быть один родитель. И всё. Как бы ты ни выёживался, всегда будет подобный затык.
Ты вообще не должен хотеть.
Вот скажи - а обязательно что бы в классе был extends?
Если есть такая необходимость, делай класс просто как свойство, и обращайся к нему через this->class->.

Но именно через extends ничего сделать не получится.

Вообще говоря "Ты не должен этого хотеть".

Как спроектировать по другому, мы сможем подсказать только если узнаем исходную *задачу*, а не попытки решить её решение.

-~{}~ 06.04.05 19:54:

А, да, кстати, троникс на идею навел - но, на самом деле, она еще ужаснее с точки зрения архитектуры, хоть и легко реализовывается, потому я тебе её не скажу... =)
 

Vitiko

Новичок
Задача - убрать дублирование одинаковых конфигурационных данных, которые передаются и в классе menuTree и menuTreeSelect.

Т.к. если бы entityTree наследовал menuTreeSelect, а не entityTreeSelect - конфигурационные данные нужно было бы передавать только в menuTreeSelect.

Понятно что напрямую это сделать нельзя. Получается в данном случае вариант 1 - передавать экземпляр enityTreeSelect при создании класса entityTree?
 

ONK

Пассивист PHPСluba
Есть причины по которым здесь нельзя заменить наследование агрегацией?
 
Сверху