Ответ 1
Прочитав комментарии по этому вопросу, я отвечу на этот вопрос:
Черты позволяют расширять класс, не входя в иерархию классов. Нет необходимости в чем-то вроде class Book extends Loggable
, поскольку сама книга не является Loggable, мы просто хотим использовать функцию Loggable. Функциональность в Loggable может быть заполнена признаком, поэтому она может использовать методы Loggable в книге, как если бы вы расширялись от нее.
Преимущество использования признаков выше использования статических методов в классах (или функций с расширением имен) заключается в том, что этот признак имеет доступ к полному классу, а также к частным членам.
Недостатком использования статических функций вместо признаков является тесная взаимосвязь (зависимости) между классами, что может повредить повторное использование и может повредить модульное тестирование (например, при использовании макетных сервисов). Зависимости должны вводиться во время выполнения, что действительно усиливает попытку создания экземпляра класса/метода, но обеспечивает большую гибкость над полным приложением. Это было новое понимание для меня.