Использование признаков PHP для симуляции множественного наследования

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

Моя текущая иерархия классов в моей структуре выглядит следующим образом:

interface IPage { /* ... */ }
interface IForm extends IPage { /* ... */ }
abstract class AbstractPage implements IPage { /* ... */ }
abstract class AbstractForm extends AbstractPage implements IForm { /* ... */ }

В моих приложениях, основанных на фреймворке, у меня было следующее:

abstract class AbstractBasePage extends AbstractPage { /* ... */ }

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

abstract class AbstractBasePage extends AbstractPage { /* ... */ }
abstract class AbstractBaseForm extends AbstractForm { /* ... */ }

Давайте предположим, что в одном приложении должна быть переменная для каждой страницы и форма, которая указывает, отображается ли что-то особенное в шаблонах. Мне нужно было бы ввести ту же переменную в AbstractBasePage И в AbstractBaseForm, Это заставило бы меня синхронизировать оба фрагмента, что совсем нехорошо.

Я думал о создании черты, которая предоставляет переменные и функции обоим классам, на которые они, в свою очередь, могут ссылаться в соответствующих функциях. Использование такой черты уменьшило бы дублирование кода, по крайней мере, так как я мог бы представить один общедоступный метод, который вызывается обоими классами, но кроме этого существует приличная абстракция, не так ли?

Это то, что черты должны помочь? Есть ли более подходящий подход?

1

Решение

В этом конкретном случае я в конечном итоге представил интерфейс (с функциями, используемыми платформой) в качестве контракта, который расширяется IPage, Кроме того, у меня была конкретная реализация, идентичная для страниц и форм в признаке, который затем, в свою очередь, использовался в классах фреймворка. AbstractPage а также AbstractForm,

Упомянутая реализация была внутри самой структуры, чтобы иметь краткий дизайн, который затем, в свою очередь, используется для этого и в моих приложениях. Для приложений я ввел черту, которая содержит переменные и функции, которые идентичны на обеих страницах и формах еще раз, который затем используется в AbstractBasePage а также AbstractBaseForm классы.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]