На этот вопрос я хочу представить свой текущий дизайн и мою идею использования черты. Я хотел бы знать, правильное ли мое понимание черт и может ли моя проблема быть решена с помощью другого дизайна, не связанного с ними.
Моя текущая иерархия классов в моей структуре выглядит следующим образом:
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
, Это заставило бы меня синхронизировать оба фрагмента, что совсем нехорошо.
Я думал о создании черты, которая предоставляет переменные и функции обоим классам, на которые они, в свою очередь, могут ссылаться в соответствующих функциях. Использование такой черты уменьшило бы дублирование кода, по крайней мере, так как я мог бы представить один общедоступный метод, который вызывается обоими классами, но кроме этого существует приличная абстракция, не так ли?
Это то, что черты должны помочь? Есть ли более подходящий подход?
В этом конкретном случае я в конечном итоге представил интерфейс (с функциями, используемыми платформой) в качестве контракта, который расширяется IPage
, Кроме того, у меня была конкретная реализация, идентичная для страниц и форм в признаке, который затем, в свою очередь, использовался в классах фреймворка. AbstractPage
а также AbstractForm
,
Упомянутая реализация была внутри самой структуры, чтобы иметь краткий дизайн, который затем, в свою очередь, используется для этого и в моих приложениях. Для приложений я ввел черту, которая содержит переменные и функции, которые идентичны на обеих страницах и формах еще раз, который затем используется в AbstractBasePage
а также AbstractBaseForm
классы.
Для этого сценария мне была нужна функция копирования и вставки, которая по сути является языковой, поскольку я хотел добавить что-то, что не так легко сделать с помощью наследования, а что-то, что можно представить в классы, являющиеся частью различных иерархий классов. Поэтому я решил использовать черты.
Других решений пока нет …