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