Как объявить черты как принимающие неявные «параметры конструктора»?

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

С точки зрения дизайна это работает хорошо и сопоставляется с доменом, так что я могу добавить функцию фильтрации отсюда (одна черта) с предикатом отсюда (другая черта) и т. Д.

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

Суть проблемы, по-видимому, в том, что я не могу предоставить аргументы конструктора для признака, чтобы их можно было пометить как неявные. Ссылка на неявный параметр в реализации метода не может быть скомпилирована с ожидаемым сообщением «не удалось найти неявное значение»; Я попытался «распространить» неявное от стадии построения (где на практике это всегда находится в области видимости) до доступности внутри метода через

implicit val e = implicitly[ClassName]

, но (как, несомненно, многие из вас ожидают) , что определение не удалось с тем же сообщением.

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


Есть ли способ пометить черту как требующую наличия определенных имплицитов во время создания?

(А если нет, то это просто еще не реализовано или есть более глубокая причина, по которой это непрактично?)

36
задан Andrzej Doyle 8 August 2011 в 14:35
поделиться