Я разрабатываю иерархию классов, которая состоит из базового класса и нескольких признаков.Базовый класс обеспечивает реализации по умолчанию нескольких методов, и признаки выборочно переопределяют определенные методы через abstract override
, чтобы действовать как составные черты / mixins.
С точки зрения дизайна это работает хорошо, и отображается надомен, чтобы я мог добавить отсюда фильтрующую функцию (одна черта) с предикатом отсюда (другая черта) и т. д.
Однако теперь я бы хотел, чтобы некоторые из моих черт принимали неявные параметры.Я счастлив, что это все еще имеет смысл с точки зрения дизайна, и на практике это не смущает.Однако я не могу убедить компилятор работать с ним.
Суть проблемы заключается в том, что я не могу предоставить аргументы конструктора для свойства, чтобы они могли быть помечены как неявные.Ссылка на неявный параметр в реализации метода не компилируется с ожидаемым сообщением «не удалось найти неявное значение»;Я пытался «распространить» неявное с этапа конструирования (где на практике оно всегда находится в области видимости) до того, чтобы оно было доступно внутри метода через
implicit val e = implicitly[ClassName]
, но (как, несомненно, многие из вас ожидают) что определение не удалось с тем же сообщением.
Кажется, что проблема здесь в том, что я не могу убедить компилятор пометить сигнатуру самой черты флагом implicit ClassName
, и заставитьвызывающие (то есть те, кто смешивает черту в объект), чтобы обеспечить неявное.В настоящее время мои абоненты делают это, но компилятор не проверяет на этом уровне.
Есть ли способ пометить черту как требующую определенных последствий, чтобы быть доступнымиво время строительства?
(А если нет, то это просто еще не реализовано или есть более глубокая причина, почему это нецелесообразно?)