Как решить это без множественного наследования? - PullRequest
2 голосов
/ 09 октября 2011

У меня есть класс с именем Controller_Home.Он должен наследоваться от Controller_Permissions и Controller_Template.Любой класс с префиксом Controller_ должен наследовать от Controller класса.

Если бы в PHP поддерживалось множественное наследование (мой случай), я мог бы сделать так:

class Controller_Home extends Controller_Permissions, Controller_Template {

Controller_Permissions, Controller_Template:

Controller_Permissions extends Controller {

Controller_Template extends Controller {

Теперь мне нужно сделать что-то вроде этого:

class Controller_Home extends Controller_Template {

class Controller_Permissions extends Controller_Template {

Controller_Template extends Controller {

Хорошо, это работает!

Теперь мне нужноиспользовать Controller_Template без разрешений (в Controller_Permissions).

Как это сделать без дублирования кода?Я не хочу другой класс Controller_TemplateWithoutPermissions.

Контроллеры, шаблоны и разрешения просто для примера.

Ответы [ 3 ]

12 голосов
/ 09 октября 2011

Обычной альтернативой множественному наследованию является использование композиции.Это делает отношения «имеет» в противоположность отношениям «есть».Т.е. в приведенном выше примере вы могли бы наследовать ControllerHome от ControllerTemplate, но некоторые ControllerPermissions могли бы быть переменной.Таким образом ControllerHome является ControllerTemplate, а имеет ControllerPermissions.

3 голосов
/ 09 октября 2011

В этом нет ничего хорошего.Все ваши классы очень тесно связаны между собой.Определение, а затем реализация интерфейсов для объектов и использование агрегации для создания типов «с разрешениями» и «без разрешений» - более чистое и «красивее» решение.Он также допускает IoC (который нарушает инкапсуляцию, если вы стойкий человек SOLID), что дает вам лучшие сценарии модульного тестирования и позволяет использовать контейнер DI.

3 голосов
/ 09 октября 2011

Вы можете использовать Черты в этой ситуации.

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

Черты доступны в PHP 5.4 и распространены в Scala.

...